목차.

  1. 문제
  2. 풀이

 

문제

 

최빈값-구하기-문제
최빈값 구하기 문제

 

풀이

 

#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을 할당해 주었습니다.

+ Recent posts