최빈값 구하기

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


제한 사항
  • 0 < array의 길이 < 100
  • 0 ≤ array의 원소 < 1000



같은 값이 여럿 있는 배열을 집합에 넣으면, 중복값이 사라지는 set의 특성을 이용하여 문제에 접근하였다.
solution함수의 전반부는 다음과 같다.

01    set<int> s(array.begin(), array.end());
02    vector<int> vec(s.begin(), s.end());
03    vector<int> repeat(s.size());
04    int index = 0;
05    for (int i : s){
06        int r = 0;
07        for (int j : array){
08            if (j==i) r++; 
09        }
10        repeat[index] = r;
11       index++;
12    }
  • 1) int형 데이터타입 set을 선언한다. 이때 set의 내부값은 벡터 array의 이터레이터를 이용하여 받아온다.
  • 2) 1번에서 선언한 set, s를 다시 벡터로 받아온다. (추후 인덱스를 활용해 값을 반환하기 위해, 순서가 없는 set 대신 vector 사용)
  • 3) int형 데이터타입 repeat을 set의 크기만큼 생성한다. (0,1,2,3 인덱스가 몇 번 반복되었는 지 값이 들어갈 예정)
  • 4) 5 ~ 12줄까지 반복 횟수를 측정할 때, set의 인덱스가 없기에 추가한 int형 데이터타입 정수이다.
  • 5) s의 원소의 값들을 i에 담아 반복한다
  • 6) r은 i값이 몇 번 반복되어 있는 지를 기록하기 위한 정수형 변수이다.
  • 7) 인자로 받아온 array 벡터를 for문을 이용하여 순회한다.
  • 8) 벡터의 값 j가 set의 원소 i와 일치할 경우, r의 값을 1 증가한다.
  • 10) 앞서 생성한 repeat 벡터의 index에 해당하는 값에 r의 값을 저장한다.
  • 11) 인덱스를 1 증가한다.


위 과정을 통해 repeat 벡터에는 각 원소가 몇 번 반복되어 있는 지가 저장되게 된다. (빈도 수)
다음 코드는 solution 함수의 후반부이다.

13    int max_index;
14    int tmp = 0;
15    for (int i = 0; i < s.size(); i++){
16        if (repeat[i] > tmp){
17            tmp = repeat[i];
18            max_index = i;
19        }
20    }
21
22    sort(repeat.rbegin(), repeat.rend());
23    if (repeat[0] == repeat[1]) return -1;
24    return vec[max_index];


  • 13) 가장 빈도 수가 높았던 원소의 인덱스 번호를 담는 int형 변수이다.
  • 14) repeat 벡터에서 해당 인덱스의 해당하는 빈도 수, 원소를 추후 나올 비교 연산을 하기 위해 생성한 int형 변수이다.
  • 15) 집합 s의 크기-1까지 i(인덱스)값을 0부터 반복한다.
  • 16) 만약, 현재 tmp에 저장되어 있는 빈도 수보다 i의 인덱스에 해당하는 빈도 수가 크다면 17, 18 코드를 실행한다.
  • 17) tmp에 repeat 벡터의 i 인덱스에 해당하는 원소의 값을 저장한다.
  • 18) max_index에 i 인덱스를 저장한다.
  • 22) 반복 횟수를 저장했던 repeat 벡터를 내림차순으로 정렬한다.
  • 23) 만약, 내림차순으로 정렬한 repeat 벡터의 첫 원소와 다음 원소 값이 같다면, 최빈값이 두 개 이상인 것이기에 -1을 반환한다.
  • 24) 2번 코드에서 선언한 벡터를 이용해 최빈값의 인덱스인 max_index의 값을 반환한다.


위 전체 과정을 통해, 주어진 vector의 최빈값 원소를 반환할 수 있다. ( 최빈값이 두 개 이상일 경우 -1 반환 )


추가한 헤더파일은 아래와 같다.

#include <set> // set
#include <algorithm> // sort


전체 solution 함수

int solution(vector<int> array){
    set<int> s(array.begin(), array.end());
    vector<int> vec(s.begin(), s.end());
    vector<int> repeat(s.size());
    int index = 0;
    for (int i : s){
        int r = 0;
        for (int j : array){
            if (j==i) r++; 
        }
        repeat[index] = r;
        index++;
    }
    
    int max_index;
    int tmp = 0;
    for (int i = 0; i < s.size(); i++){
        if (repeat[i] > tmp){
            tmp = repeat[i];
            max_index = i;
        }
    }

    sort(repeat.rbegin(), repeat.rend());
    if (repeat[0] == repeat[1]) return -1;
    else return vec[max_index];
}



set, sort, iterator