[프로그래머스] 위장
문제 내용
문제 설명
스파이들은 매일 다른 옷을 조합하여 입어 자신을 위장합니다.
예를 들어 스파이가 가진 옷이 아래와 같고 오늘 스파이가 동그란 안경, 긴 코트, 파란색 티셔츠를 입었다면 다음날은 청바지를 추가로 입거나 동그란 안경 대신 검정 선글라스를 착용하거나 해야 합니다.
종류 | 이름 |
얼굴 | 동그란 안경, 검정 선글라스 |
상의 | 파란색 티셔츠 |
하의 | 청바지 |
겉옷 | 긴 코트 |
스파이가 가진 의상들이 담긴 2차원 배열 clothes가 주어질 때 서로 다른 옷의 조합의 수를 return 하도록 solution 함수를 작성해주세요.
제한사항
-
clothes의 각 행은 [의상의 이름, 의상의 종류]로 이루어져 있습니다.
-
스파이가 가진 의상의 수는 1개 이상 30개 이하입니다.
-
같은 이름을 가진 의상은 존재하지 않습니다.
-
clothes의 모든 원소는 문자열로 이루어져 있습니다.
-
모든 문자열의 길이는 1 이상 20 이하인 자연수이고 알파벳 소문자 또는 '_' 로만 이루어져 있습니다.
-
스파이는 하루에 최소 한 개의 의상은 입습니다.
입출력 예
clothes | return |
[[yellow_hat, headgear], [blue_sunglasses, eyewear], [green_turban, headgear]] | 5 |
[[crow_mask, face], [blue_sunglasses, face], [smoky_makeup, face]] | 3 |
나의 생각
1. 어떻게 풀까?
부위 별 옷의 개수를 정리합니다.
answer : 반환할 변수
m : 옷의 종류를 key값으로 개수를 카운팅 할 변수
#include <unordered_map>
int solution(vector<vector<string>> clothes){
int answer = 1;
unordered_map <string, int> m;
for(int i = 0; i < clothes.size(); ++i){
m[clothes[i][1]]++;
}
}
2. 종류 별로 정리했으면 경우의 수를 어떻게 구할까?
만약 3가지의 옷의 종류(얼굴, 상의, 하의)가 있다면 그 3가지 옷으로 입을 수 있는 경우의 수를 구하는 방법은
아래와 같을 것입니다.
(얼굴 옷의 개수) x (상의 옷의 개수) 개수) x (하의 옷의 개수)
하지만 이번 문제는 각각의 종류의 옷을 안 입는 경우도 포함되어 있습니다.
그렇다면 각 옷의 개수에 1 (옷을 입지 않는 경우)을/를 더해줍니다.
(얼굴 옷의 개수 + 1) x (상의 옷의 개수 + 1) x (하의 옷의 개수 + 1)
그 결과 세 종류의 옷을 다 안 입는 경우도 그 값에 포함되어 결괏값이 나옵니다.
즉, 아예 안 입는 경우를 저 식에서 빼줍니다.
((얼굴 옷의 개수 + 1) x (상의 옷의 개수 + 1) x (하의 옷의 개수 + 1)) - 1
int solution(vector<vector<string>> clothes){
...
for(auto & pair : m)
answer *= (pair.second +1);
return answer - 1;
}
전체 코드
#include <string>
#include <vector>
#include <unordered_map>
using namespace std;
int solution(vector<vector<string>> clothes) {
int answer = 1;
unordered_map <string, int> m;
for(int i = 0; i < clothes.size(); ++i){
m[clothes[i][1]]++;
}
for(auto & pair : m){
answer *= (pair.second + 1);
}
return answer-1;
}
테스트 코드 (필요하신 분만)
int main(){
const vector<vector<vector<string>>> testcases = {
{
{"yellow_hat", "headgear"},
{"blue_sunglasses", "eyewear"},
{"green_turban", "headgear"}
},
{
{"crow_mask", "face"},
{"blue_sunglasses", "face"},
{"smoky_makeup", "face"}
}
};
for(auto & testcase : testcases){
const int ret = solution(testcase);
cout << ret << endl;
}
return 0;
}
'알고리즘' 카테고리의 다른 글
[KMP] 카누스 모리스 프렛 알고리즘 (feat.cpp) (0) | 2020.11.04 |
---|---|
트라이 알고리즘이란 ? (feat.cpp) (0) | 2020.11.03 |
[heap] 힙 이란? (feat.cpp) (0) | 2020.11.01 |
[프로그래머스] 가장 큰 수 (0) | 2020.10.30 |
[프로그래머스] 괄호 변환 (0) | 2020.10.29 |