- 문제 풀이
"해시"를 사용하여 해결하는 문제이다.
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;
}
'프로그래머스' 카테고리의 다른 글
| 위장 - 프로그래머스, c++ (0) | 2023.01.13 |
|---|---|
| 전화번호 목록 - 프로그래머스, c++ (0) | 2023.01.12 |
| 완주하지 못한 선수 - 프로그래머스, C++ (1) | 2023.01.11 |
| 올바른 괄호 - 프로그래머스, c++ (0) | 2023.01.10 |
| 개인정보 수집 유효기간 - 프로그래머스, c++ (0) | 2023.01.10 |