hyunjin

[C++][해시/위장] unordered_map, 경우의 수,iterator 본문

알고리즘 연습/프로그래머스

[C++][해시/위장] unordered_map, 경우의 수,iterator

_h.j 2020. 8. 31. 11:53
728x90

프로그래머스/해시/위장 바로가기

 

 

[소스 코드]

#include <string>
#include <vector>
#include <unordered_map>

using namespace std;

int solution(vector<vector<string>> clothes) {
    int answer = 1;
    unordered_map <string, int> hash;
    
    for(vector<string> pair : clothes)
        hash[pair[1]]++;
    unordered_map <string,int> :: iterator it;
    for(it = hash.begin(); it != hash.end() ; it++){
        answer = answer*(it->second +1 );
    }
    
    return answer-1;
}

다른 사람 풀이를 참고 했다.

 

[풀이 전략]

1. 이 문제의 핵심은 최소 한 개의 의상을 뽑는 것이다.

   여러 경우의 수에서 최소 한 개 이상을 뽑는 문제는 반대로 풀면 된다.

   모든 경우의 수에서 아예 안입는 경우를 빼면 된다.!!!

 

2. 모든 경우의 수를 구하는 방법은??

   각 의상 종류별 개수에 +1을 해준 후 곱한다. 즉, 선택하지 않음의 경우를 추가해주는 것

종류 이름 개수
얼굴 둥근 안경, 검정 선글라스, 선택 안함 3
상의 파란 티, 선택 안함 2

이 케이스에서 모든 가능한 조합은 총 3*2 =6  이다.

이 중 아예 선택을 안하는 (선택안함, 선택 안함)의 경우를  뻬준다.

 

 

[배운 내용]

1. 데이터 양이 적을 땐 unordered_map, 많을 땐 map

 

2. map.insert(make_pair) 보단 m[key]로 바로 사용

 

3. std:: map 종류의 operator[]는 항목이 없으면 자동 초기값 만든다.

초기값은 value type의 기본 초기값 (수 종류는 0으로 string은 "")

 

4. iterator 쓰는 방법 타입써주고 iterator 쓰고 변수 명

unordered_map<string,int> :: iterator it;

 

 

참고 사이트

풀이 참고 바로가기

map과 unorderd_map 설명 바로가기

unorderd_map 바로가기

unorderd_map 초기화 내용 바로가기

 

 

 

 

 

728x90