본문 바로가기
알고리즘/코딩테스트 고득점kit

[해시] 위장

by sum_mit45 2022. 3. 14.
728x90
반응형

1. 문제 요약

- 서로 다른 옷의 조합 구하기

 

2. 풀이

- 옷의 종류가 string으로 저장되어 있으니 map에 <옷의 종류, 그 갯수>를 저장한다.

- map의 iterator를 통해 저장되어 있는 옷의 개수를 구해올 수 있다. 

 

3. 코드

//틀린 코드
#include <string>
#include <vector>
#include <map>
using namespace std;

int solution(vector<vector<string>> clothes) {
    int answer = 0;
    map<string, int> m;
    
    for(int i=0; i<clothes.size(); i++){
        string str = clothes[i][1];
        if (m.find(str) != m.end()){ // 찾으면
            m[str]++;
        }    
        else{
            m.insert({str,1});
        }
        answer++;
    }
    
    int temp=1;
    
    if (m.size() > 1) {
        for (auto iter = m.begin(); iter != m.end(); iter++) {
           temp *= iter->second;
        }
        answer += temp;
        return answer;       
    }
    else {
        return answer;
    }
}
더보기

무조건 종류마다 옷을 입어야 하는 줄 알았는데, 그게 아니었다ㅋㅋㅋ

그냥 뭐든 하나 이상 걸치기만 하면 되는 거였다. 단 한 종류에서는 하나만!

 

예를 들어, A종류 옷이 3개 B종류 옷이 2개 C종류 옷이 4개 있다면

A종류 옷 중에서는 a1, a2, a3, 입지 않는 경우 이렇게 4가지의 경우가 될 수 있다. 

B종류 옷 중에서는 b1,b2,입지 않는 경우

C종류 옷 중에서는 c1,c2,c3,c4,입지 않는 경우

 

temp = (3+1) * (2+1) * (4+1) 를 구한다.

answer = temp - 1 // 아무 옷도 입지 않은 경우를 빼주면 된다. 

#include <string>
#include <vector>
#include <map>
using namespace std;

int solution(vector<vector<string>> clothes) {
    int answer = 0;
    map<string, int> m;
    
    for(int i=0; i<clothes.size(); i++){
        string str = clothes[i][1];
        if (m.find(str) != m.end()){ // 찾으면
            m[str]++;
        }    
        else{
            m.insert({str,1});
        }
    }
    
    int temp=1;
    
    for (auto iter = m.begin(); iter != m.end(); iter++) {
          temp = temp * (iter->second+1);
    }
    answer = temp-1;
        
    return answer;
}

 

728x90
반응형

'알고리즘 > 코딩테스트 고득점kit' 카테고리의 다른 글

[해시] 완주하지 못한 선수  (0) 2022.03.13