문제 설명
programmers.co.kr/learn/courses/30/lessons/42578
스파이들은 매일 다른 옷을 조합하여 입어 자신을 위장합니다. 예를 들어 스파이가 가진 옷이 아래와 같고 오늘 스파이가 동그란 안경, 긴 코트, 파란색 티셔츠를 입었다면 다음날은 청바지를 추가로 입거나 동그란 안경 대신 검정 선글라스를 착용하거나 해야 합니다. 스파이가 가진 의상들이 담긴 2차원 배열 clothes가 주어질 때 서로 다른 옷의 조합의 수를 return 하도록 solution 함수를 작성해주세요. 제한사항
|
근데 청바지를 추가로 입는다면
1. 전날에는 바지를 안입었다.ㅎ
2. 전날에도 바지는 입었으나 그 위에 또 청바지를 입는다.
둘 중에 뭔지 해명 부탁드립니다. @스파이
문제 풀이
일단 문제를 보고 할일을 정리해보면 크게 두 가지다.
1. 옷 종류별로 세기
2. 경우의 수 구하기
1. 옷 종류 별로 세기
multimap을 이용해서 옷 종류에 대해 정렬하고 각각 갯수를 세서 배열에 저장하면 된다.
코드는 다음과 같다.
multimap<string, string> c_map;
for (auto c : clothes)
c_map.insert(pair<string, string>(c[1], c[0]));
vector<int> numbers = {0};
string prev = (*c_map.begin()).first;
for (auto it = c_map.begin(); it != c_map.end(); it++)
{
if (prev != (*it).first)
{
numbers.push_back(1);
prev = (*it).first;
}
else
++numbers.back();
}
c_map에 넣고 포문으로 돌면서 현재 옷 종류가 직전 옷 종류와 다르면 배열에 새로운 숫자 1을 넣고, 같으면 마지막 원소에 1을 더해주는 로직이다.
2. 경우의 수 구하기
재귀로 풀면 간단하다.
void recursive(vector<int> numbers, int k, int current, int &answer)
{
if (numbers.size() < k)
return;
else if (k == 0)
{
answer += current;
return;
}
auto it = numbers.begin();
while (!numbers.empty())
{
int n = *it;
numbers.erase(it);
recursive(numbers, k - 1, current * n, answer);
}
}
numbers: 옷 갯수를 센 배열
k: 선택할 옷 가짓수 (eg: 모자, 바지, 상의를 고른다고 하면 k는 3)
current: 해당 시점까지 계산한 경우의 수
최종 코드
#include <string>
#include <vector>
#include <iostream>
#include <map>
using namespace std;
void recursive(vector<int> numbers, int k, int current, int &answer)
{
if (numbers.size() < k)
return;
else if (k == 0)
{
answer += current;
return;
}
auto it = numbers.begin();
while (!numbers.empty())
{
int n = *it;
numbers.erase(it);
recursive(numbers, k - 1, current * n, answer);
}
}
int solution(vector<vector<string> > clothes)
{
int answer = 0;
multimap<string, string> c_map;
for (auto c : clothes)
c_map.insert(pair<string, string>(c[1], c[0]));
vector<int> numbers = {0};
string prev = (*c_map.begin()).first;
for (auto it = c_map.begin(); it != c_map.end(); it++)
{
if (prev != (*it).first)
{
numbers.push_back(1);
prev = (*it).first;
}
else
++numbers.back();
}
for (int i = 0; i < numbers.size(); ++i)
{
vector<int> temp(numbers);
recursive(temp, i + 1, 1, answer);
}
return answer;
}
실행 결과
아 ㅋㅋ 시간 초과 뭔데 ㅋㅋ
map 정렬하는거에서 시간을 좀 잡아먹었나본데 굳이 map 안 써도 그냥 옷 종류만 어디 저장해서 hash function 으로 풀면 될 것 같다.
다음에 할게요 >.0
'알고리즘 문제 > 프로그래머스' 카테고리의 다른 글
[C++] 프로그래머스 힙 디스크 컨트롤러 풀이 (0) | 2021.05.16 |
---|---|
프로그래머스 탐욕법 구명보트 c++ 풀이 (1) | 2021.04.04 |
프로그래머스 완전탐색 소수찾기 c++ 풀이 (0) | 2021.03.14 |
프로그래머스 스택/큐 프린터 c++ 풀이 (0) | 2021.03.07 |
프로그래머스 스택/큐 다리를 지나는 트럭 (0) | 2021.02.28 |