https://programmers.co.kr/learn/courses/30/lessons/42578
의상 종류마다 개수를 이용해 조합을 구해야한다.
a,b,c
의 종류의 의상이 차례로 3,2,1
개 있을 때
각 의상을 입는 방법의 수는 (3+1)
, (2+1)
, (1+1)
이다. 1을 더해주는 이유는 안입을 수도 있기 때문!
따라서 각 방법을 곱해주면 조합의 개수가 나온다.
여기서 최소 하나의 의상은 입어야 하므로 아무것도 입지 않는 경우 1개를 빼주면 된다.
현재 배열은 [[이름, 종류], [이름,종류], [이름,종류]]
이렇게 되어있으므로 배열을 돌며 각 종류를 key
로 하는 맵의 value
값을 하나씩 늘려 카운트해준다.
이후 맵을 순회하면서 각 (value+1)
을 차례로 곱해주고 나중에 하나 빼주면 끝!
#include <string>
#include <vector>
#include <map>
#include <iostream>
using namespace std;
int solution(vector<vector<string>> clothes) {
int answer = 1;
map<string,int> m; //의상 종류, 개수
//의상 종류마다 개수 저장.
for(int i=0;i<clothes.size();i++){
if(m.count(clothes[i][1])==0) m[clothes[i][1]]=1; //key값이 없을 경우
else m[clothes[i][1]]+=1;
}
// (의상a 개수 +1)*(의상b 개수 +1)*... -1 (모두 입지 않은 경우)
for(auto it=m.begin();it!=m.end();it++){
answer*=it->second+1;
}
return answer-1;
}
//의상 종류마다 개수 저장
for(int i=0;i<clothes.size();i++){
if(m.count(clothes[i][1])==0) m[clothes[i][1]]=1; //key값이 없을 경우
else m[clothes[i][1]]+=1;
}
이렇게key 값이 없는 경우는 따로 생각해줬는데, 그냥 바로 m[clothes[i][1]]+=1
해도 되는 것 같다.
그리고 auto를 이용해 더 간단하게 표현하면
for(auto item : clothes) //clothes의 각 행!
m[item[1]]++; //item[1] 은 해당 행의 1열을 의미함, 즉 옷 종류
이런 코드도 가능함!
2차원 벡터는 안 써봐서 헷갈렸음
map[key]=value;
map.insert(make_pair(key,value));
map.erase(key); : 주어진 key와 그 key의 value쌍을 삭제한다.
map[key]; → value값 출력
map.count(key);
주어진 key의 요소 개수를 반환한다. 그런데 key는 고유값이므로 count함수는 0,1만 반환 가능하다.
map[key]+=a;
map[key]=value;
map[key]는 value이므로, 일반적으로 변수를 변경할 때처럼 다루면 된다.
for(iter = m.begin(); iter != m.end() ; iter++){
cout << "[" << **iter->first** << ", " << **iter->second** << "]" << " ";
}
key: iter->fisrt
value: iter->second