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
반응형
'알고리즘 > Programmers' 카테고리의 다른 글
[Programmers] Level 1. 두 개 뽑아서 더하기 (C++) (0) | 2021.03.22 |
---|---|
[Programmers] Level 1. 크레인 인형뽑기 게임 (C++) (0) | 2021.03.22 |
[Programmers] Level 2. 스킬트리 (2018 윈터코딩 / C++) (0) | 2019.08.12 |
[Programmers] Level 1. 체육복 (C++) (0) | 2019.07.26 |
[Programmers] Level 1. 모의고사 (C++) (0) | 2019.07.25 |