LeeTaes 공부노트

[프로그래머스/C++ 문제 풀이] Lv. 0 - 최빈값 구하기 본문

코딩테스트/프로그래머스 (Lv. 0)

[프로그래머스/C++ 문제 풀이] Lv. 0 - 최빈값 구하기

리태s 2024. 6. 29. 22:56
728x90
반응형

문제 설명

최빈값은 주어진 값 중에서 가장 자주 나오는 값을 의미합니다. 정수 배열 array가 매개변수로 주어질 때, 최빈값을 return 하도록 solution 함수를 완성해보세요. 최빈값이 여러 개면 -1을 return 합니다.

제한 사항

  • 0 < array의 길이 < 100
  • 0 ≤ array의 원소 < 1000

입출력 예

array result
[1, 1, 2, 2] -1
[1] 1
[1, 2, 3, 3, 3, 4] 3

 

입출력 예 #1

  • [1, 2, 3, 3, 3, 4]에서 1은 1개 2는 1개 3은 3개 4는 1개로 최빈값은 3입니다.

입출력 예 #2

  • [1, 1, 2, 2]에서 1은 2개 2는 2개로 최빈값이 1, 2입니다. 최빈값이 여러 개이므로 -1을 return 합니다.

입출력 예 #3

  • [1]에는 1만 있으므로 최빈값은 1입니다.

문제 풀이

이번 문제는 주어진 값들 중 최빈값을 찾고(1), 동일한 최빈값을 가지는 요소가 있는지 판별(2)하는 문제입니다.

 

저는 간단히 전체 값들이 저장될 수 있는 배열을 선언하여 모든 수를 순회하며 빈도수를 저장하고, 이후 해당 배열을 순회하며 최빈값과 중복된 최빈값의 수를 찾아주는 방식으로 문제를 해결하였습니다.

 

개인적으로 map 자료구조를 사용하면 더욱 쉽게 풀이가 가능할 것이라고 생각하고, 두 가지 방법 중 map이 아닌 배열을 통해 풀이하는 방식이 조금 더 복잡하다고 생각하여 풀이를 남기게 되었습니다.

정답 코드

더보기
#include <string>
#include <vector>

using namespace std;

const int SIZE = 1002;
int arr[SIZE];

int solution(vector<int> array) {
    int answer = 0;

    for (int num : array)
    {
        arr[num]++;
    }

    int mxIndex = 0;
    int mxValue = 0;
    int mxCount = 0;

    for (int num = 0; num < SIZE; num++)
    {
        // 만약 해당 숫자의 중복 값이 현재까지의 최대 값보다 크다면?
        if (arr[num] > mxValue)
        {
            // 현재 중복 값 갱신
            mxValue = arr[num];
            // 인덱스 저장
            mxIndex = num;
            // 카운트 초기화
            mxCount = 1;
        }
        // 만약 해당 숫자의 중복 값이 현재까지의 최대 값과 동일하다면?
        else if (arr[num] == mxValue)
        {
            // 카운트 증가
            mxCount++;
        }
    }

    if (mxCount > 1)
        answer = -1;
    else
        answer = mxIndex;

    return answer;
}
728x90
반응형