프로그래머스

위장 - 프로그래머스, c++

2023. 1. 13. 13:18

 

 

- 문제 풀이

"해시"를 사용하는 문제였다.

주어진 string 배열을 인덱스 1부분은 "키", 인덱스 0부분은 "값"으로 정해 해시로 표현하면 간단하게 문제를 해결할 수 있었다.

(특히 이렇게 해시로 표현하면 string으로 표현된 값을 int형으로 바꿔줄 수 있다는 것에 유리하다.)

1. 인덱스 1을 "키"로 설정해 해시테이블을 만들고, 

2. for문을 통해 경우의 수를 계산하면 되는 문제이다.

 

 

- 코드

처음 해시테이블에 값을 저장하는 코드의 for문을 쓸 때 cloth의 변수를 string으로 지정했고,       오류가 났다.

     이렇게 자료형으로 오류가 나면 auto로 변수를 지정해주는 것이 좋다.

→ 해시테이블에 값을 저장할 때 vector의 인덱스[1]의 값을 "키"로 사용해 해시를 저장해야해서

     temp[cloth[1]]++ 이라고 써주는 것이 중요했다.

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

int solution(vector<vector<string>> clothes) {
    int answer = 1;
    unordered_map<string, int> temp;
    
    //해시테이블에 값 저장
    for (auto cloth : clothes) {
        temp[cloth[1]]++;
    }
    
    //해시테이블 순회하며 answer값 계산하기 (순회 시 iterator형태로 사용해도 됨)
    //각 키에 해당하는 값에 안 입는 경우까지 +1 한 후 곱해 모든 경우의 수를 계산
    for(auto pair : temp) {
        answer *= pair.second+1;
    }
    
    // 계산한 경우의 수 중 모두 안 입는 경우 1가지는 빼주기
    answer -= 1;
    
    return answer;
}

 

 

아래 코드는 위에서 말했던 for문을 pair가 아닌 iterator을 사용해 구현한 방법이다.

이 역시 코드는 잘 돌아간다.

(참고: https://rooted.tistory.com/14)

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

int solution(vector<vector<string>> clothes) {
    int answer = 1;
    unordered_map<string, int> temp;
    
    //해시테이블에 값 저장
    for (auto cloth : clothes) {
        temp[cloth[1]]++;
    }
    
    //해시테이블 순회하며 answer값 계산하기 (순회 시 iterator형태로 사용해도 됨)
    //각 키에 해당하는 값에 안 입는 경우까지 +1 한 후 곱해 모든 경우의 수를 계산
    for(auto iterator=temp.begin(); iterator!=temp.end(); iterator++) {
        answer *= iterator->second+1;
    }
    
    // 계산한 경우의 수 중 모두 안 입는 경우 1가지는 빼주기
    answer -= 1;
    
    return answer;
}