[코딩 테스트] 최빈값 구하기(1)
최빈값 구하기
최빈값은 주어진 값 중에서 가장 자주 나오는 값을 의미합니다. 정수 배열 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의 값을 반환한다.
추가한 헤더파일은 아래와 같다.
#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