프로그래머스

폰켓몬 - 프로그래머스, c++

2023. 1. 12. 14:48

 

 

- 문제 풀이

"해시"를 사용하여 해결하는 문제이다.

1. 먼저 #include <unordered_map> 을 불러와 해시를 사용할 수 있도록 했다.

2. 사용할 변수 N과 해시테이블을 선언한다.

3. vector 'nums'에 있는 값들을 for문을 통해 해시테이블에 저장한다.

(해시테이블이기 때문에 "키"가 같으면 같은 공간에 "값"을 저장한다. 같은 "키"가 여러개 있을 수 없다.)

4. for문을 통해 해시테이블을 순회하며 실제 값을 갖는 "키"는 몇 개가 되는지 계산해 count 변수에 저장한다.

5. if - else문을 통해 N/2값과 count r값을 비교해 상황에 따라 적절한 값을 answer에 저장한다.

 

 

 

- 코드

내가 작성한 코드는 아래와 같다. 

일단 코드는 잘 돌아갔다.

 

그런데 해시테이블을 순회하며 실제 유의미한 값을 저장하는 "키"의 개수를 세는 코드 부분에서,

그냥 <unordered_map>에 내장된 count(key) 함수를 사용해도 되지 않을 까하는 생각을 했다.

(또는 이미 내장된 함수가 있지 않을까 생각했다.)

 

하지만 생각해보니 count(key) 함수는 하나의 "키"안에 있는 "값"들이 여러 개일 때 그 "값"들의 개수를 세어주는 함수이므로 "키"의 개수를 알고 싶은 지금 상황에선 맞지 않았다.

대신 count 하기 위해 순회하는 for문보다 temp.size() 함수를 통해 간단하게 처리할 수도 있겠다고 생각했다.

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

int solution(vector<int> nums) {
    int answer = 0;    
    int N = nums.size(); //vector 크기 구하기
    unordered_map<int, int> temp;
     
    //nums에 있는 값을 해시테이블에 저장
    for (int num : nums) {
        temp[num]++;
    }

    //해시테이블 순회하며 실제 값을 저장하고 있는 키 계수 세기
    int count = 0;
    for (auto pair : temp) {
        if (pair.second > 0) {
            count++;
        }
    }
    
    //N/2와 count값을 비교해 결과값을 정하기
    if( (N/2) <= count ) {
        answer = N/2;
    }
    else {
        answer = count;
    }
    
    return answer;
}

 

 

아래 코드는 위에서 말했던 해시테이블 순회 코드 대신 temp.size() 를 통해 더 간단하게 작성해 본 코드이다.

이 역시 잘 돌아간다.

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

int solution(vector<int> nums) {
    int answer = 0;    
    int N = nums.size(); //vector 크기 구하기
    unordered_map<int, int> temp;
     
    //nums에 있는 값을 해시테이블에 저장
    for (int num : nums) {
        temp[num]++;
    }

    //해시테이블 순회하며 실제 값을 저장하고 있는 키 계수 세기
    int count = temp.size();
    
    //N/2와 count값을 비교해 결과값을 정하기
    if( (N/2) <= count ) {
        answer = N/2;
    }
    else {
        answer = count;
    }
    
    return answer;
}