문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/42578#
문제 설명

스파이들은 매일 다른 옷을 조합하여 입어 자신을 위장합니다.

예를 들어 스파이가 가진 옷이 아래와 같고 오늘 스파이가 동그란 안경, 긴 코트, 파란색 티셔츠를 입었다면 다음날은 청바지를 추가로 입거나 동그란 안경 대신 검정 선글라스를 착용하거나 해야 합니다.

종류이름
얼굴동그란 안경, 검정 선글라스
상의파란색 티셔츠
하의청바지
겉옷긴 코트

스파이가 가진 의상들이 담긴 2차원 배열 clothes가 주어질 때 서로 다른 옷의 조합의 수를 return 하도록 solution 함수를 작성해주세요.

제한사항
  • clothes의 각 행은 [의상의 이름, 의상의 종류]로 이루어져 있습니다.
  • 스파이가 가진 의상의 수는 1개 이상 30개 이하입니다.
  • 같은 이름을 가진 의상은 존재하지 않습니다.
  • clothes의 모든 원소는 문자열로 이루어져 있습니다.
  • 모든 문자열의 길이는 1 이상 20 이하인 자연수이고 알파벳 소문자 또는 '_' 로만 이루어져 있습니다.
  • 스파이는 하루에 최소 한 개의 의상은 입습니다.
입출력 예

clothesreturn
[[yellow_hatheadgear], [blue_sunglasseseyewear], [green_turbanheadgear]]5
[[crow_maskface], [blue_sunglassesface], [smoky_makeupface]]3


해결 방법)


한 4번정도 시도끝에 도저히 아이디어가 안떠올라서 힌트를 얻으러 돌아다녔다 


마침 이문제를 푼 사람을 발견했고, 그사람이 푼 과정을 보게 되었다. (감사합니당 알려주셔서 ㅎㅎ)

그런데 내가 멍청한건지 그 과정을 봐도 이해를한번에 하기 힘들었다.


그래도 푼 사람이니까 믿고 그 방법순서대로 그려가면서 이해해보려했다.

어 그러니까 이게 무슨일이지 그 방법대로하니까 모든 조합의 수가 나와버렸다 ....... 


그 방법은 예를 들어서 설명해보겠다.


example) 

배가 a, b, c 라는 이름의 3개가 있다.

귤은 e, f 라는 이름의 2개가 있다.


여기서 배는 안골랐다라는 경우를 포함해서 (0,a,b,c) 4개가 된다. 

마찬가지로 귤도 안골랐다라는 경우를 포함해서 (0,e,f) 3개가 된다.

이렇게 되면 4*3 =  12가지이고 여기서 0,0 인 둘다 안고르는 경우는 없기 떄문에 -1을 해주면 11가지로 답을 구할 수 있다.


종류를 하나 더 추가해서 보면


배 a,b,c 3개 

귤 e,f 2개

사과 g, h ,i 3개

이렇게 주어졌다고하고 위의 방법대로 하면,

(배 + 1) * (귤 + 1) * (사과 +1) -1 이 총 가지수가 된다.


저기 + 1은 그 종류를 안고른 경우가 되기때문에 모든 조합의 가지수가 나오게된다.


알고리즘 구성을 보면

입력받은 2차원 문자열 배열에서 같은 종류마다 있는 개수 정보를 저장한다.

그리고 그 개수마다 +1 씩해가며 모든 종류를 곱해준다. 

최종적으로 구해진 값에 -1 (전부없는경우)을 한다.


소스코드)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <string>
#include <vector>
int a[31= { 0, };
int v[31];
using namespace std;
 
int solution(vector<vector<string>> clothes) {
    int answer = 0;
    int size ;
    int ret = 1;
    size = clothes.size();
    for(int i =0 ;i<31; i++)
    {
        v[i] = 0;
    }
    for(int i = 0; i<size; i++)
    {
         if(v[i] == 1)
                continue;    
         for(int j = i ; j<size; j++)
         {
            if(clothes[i][1== clothes[j][1] )
            {
                a[i]++// i번째 종류 증가
                v[j]= 1;
            }
        }
    }
    for(int i = 0 ; i< 31; i++)
    {
        if(a[i]>0)
        {
            ret *= (a[i] +1);
        }
    }
    answer = ret - 1;
    return answer;
}
cs




반응형

+ Recent posts