728x90
반응형

소스코드

#include <string>
#include <string.h>
#include <vector>
#include <iostream>
#include <map>

using namespace std;

int solution(vector<vector<string>> clothes) {
    int answer = 1;
    vector<string> v;
    map<string, int> m;
    map<string, int>::iterator iter;
    for(int i=0; i<clothes.size(); i++) v.push_back(clothes[i][1]);
    
    for(int i=0; i<v.size(); i++)  m[v[i]]++;
    
    for(iter = m.begin(); iter != m.end(); ++iter){
        cout << (*iter).first << " : " << (*iter).second << "\n";
        cout << ((*iter).second + 1) << "\n";
        answer *= ((*iter).second + 1);
    }
    answer--;
    
    return answer;
}

 

정리

단순하게 생각해 의상의 종류가 각 몇 개씩 있는지만 알면 풀 수 있는 문제였다.
따라서, map을 잘 활용해서 갯수를 세어준다면 충분히 쉽게 풀 수 있는 문제였다.
하지만 나는 map을 사용하지 않고 풀다가 돌고 돌아 결국 map을 이용해서 문제를 풀 수 있었다.
소스를 보면 map의 key, value 를 이용해서 key의 값에 따라 value의 값을 증가시켜주는 방법으로 갯수를 세어주었고
각 의상의 종류에 +1 을 해준 후에 곱하고 마지막에 1 을 빼준다.

예를 들면,
모자가 2개(A, B), 안경이 1개(A) 있다고 하자.
그럼 모자를 쓰지 안 쓸 경우, 1개 쓸 경우, 2개 쓸 경우 해서 총 3가지의 경우의 수가 된다.
안경도 마찬가지로 안 쓸 경우, 1개 쓸 경우 해서 총 2가지의 경우의 수가 된다.
조금 더 직관적으로 예를 풀어써보면

아무것도 안 입을 경우
모자 A
모자 B
안경 A
모자 A, 안경 A
모자 B, 안경 B

이렇게 총 6개의 경우의 수가 존재한다.
문제에서 최소 한 개의 의상은 입는다고 했기 때문에 아무것도 입지 않을 경우를 빼준다.
따라서 5개의 조합이 가능하다.

정리를 해보자면 (모자의 갯수 + 1) * (안경의 개수 + 1) - 1 (아무 것도 안 입을 경우) 가 된다.

728x90
반응형
복사했습니다!