728x90
목차.
문제
풀이
#include <string>
#include <vector>
#include <unordered_map>
using namespace std;
int solution(vector<int> array) {
int answer = 0;
int maxNum = 0;
// 정수와 해당 정수의 등장 횟수를 저장하기 위한 unordered_map
unordered_map<int, int> um;
// 배열을 순회하며 각 숫자의 등장 횟수를 세는 과정
for (const auto num : array) {
um[num]++;
}
// unordered_map을 순회하며 최빈값을 찾는 과정
for (const auto& num : um) {
if (num.second > maxNum) { // 현재 등장 횟수가 최빈값보다 큰 경우
maxNum = num.second; // 최빈값을 업데이트
answer = num.first; // 해당 숫자를 정답으로 설정
} else if (num.second == maxNum) { // 현재 등장 횟수가 최빈값과 같은 경우
answer = -1; // 최빈값이 여러 개인 경우 -1을 정답으로 설정
}
}
return answer;
}
위 코드 설명을 위해 array에 [1,2,3,3,3,4]가 있다고 가정하겠습니다.
for (const auto num : array) {
um[num]++;
}
반복문 1회 실행 : 'um [1]'이 존재하지 않기 때문에 새 항목을 추가하고 값을 1로 초기화합니다.
um 은 '{1 : 1}'의 형태
2회 실행 : 'um[2]'이 존재하지 않기 때문에 새 항목을 추가하고 값을 1로 초기화합니다.
um 은 '{1 : 1, 2: 1}'의 형태
3회 실행 : 'um [3]'이 존재하지 않기 때문에 새 항목을 추가하고 값을 1로 초기화합니다.
um 은 '{1 : 1, 2: 1, 3:1}'의 형태
4회 실행 : 'um[3]'이 이미 존재하기 때문에 해당 항목의 값을 1 증가합니다.
um 은 '{1 : 1, 2: 1, 3:2}'의 형태
.....
최종적으로 해시 맵은 {1 : 1, 2 : 1, 3 : 3, 4 : 1}의 형태를 갖습니다.
for (const auto& num : um) {
if (num.second > maxNum) { // 현재 등장 횟수가 최빈값보다 큰 경우
maxNum = num.second; // 최빈값을 업데이트
answer = num.first; // 해당 숫자를 정답으로 설정
} else if (num.second == maxNum) { // 현재 등장 횟수가 최빈값과 같은 경우
answer = -1; // 최빈값이 여러 개인 경우 -1을 정답으로 설정
}
}
모든 해시 맵을 순회 합니다.
num.second는 값이 반복될 때마다 1 증가한 값입니다.
maxNum보다 크면 maxNum에 해당 값을 할당해 줍니다.
그리고 answer에 해당 값의 키를 할당합니다.
그리고 최빈값과 현재 값이 같다면 최빈값이 여러 개라고 판단하고 -1을 할당해 주었습니다.
728x90
'코딩테스트' 카테고리의 다른 글
[C++] 백준 9012번 : 괄호 (0) | 2023.09.28 |
---|---|
[C++][Stack] 백준 10828번 : 스택(Stack) (0) | 2023.09.27 |
C++ : 분수의 덧셈 (0) | 2023.09.14 |
[백준][C++] 10798 문제 : 세로읽기 (0) | 2023.08.24 |
[백준][C++] 4673 문제 : 셀프 넘버 (0) | 2023.08.24 |