프로그래머스 최빈값 문제이다.
우선 로직을 생각해보았는데,
count 변수를 선언하고
array 배열을 정렬하고 반복문을 통해서 array[i]값과 array[i+1]값을 비교해서 count값을 하나씩 더 해주어 비교를 하면 되지 않을까?... 라는 생각이 들어 시도해봤다.
function solution(array) {
var arr = array.sort((a,b) => a - b);
var num = array[0]
var count = 0;
var count1 = 0;
var indexNum = 0;
for (let i = 0; i < array.length; i++){
if (num == array[i]) {
count++
if(count > count1){
count1 = count
indexNum = i
}
}else{
count = 0
num = array[i]
}
}
return arr[indexNum]
}
최빈값을 잘 반환 하였으나, 입출력 예로 제시된 상황 중에 최빈값이 여러 개인 상황에서 -1값을 반환하는데에 문제가 생겼다.
for문을 한 번 더 돌려서 비교를 시도해보거 했으나 코드가 너무 지저분해지고 for문과 if문이 엄청나게 중첩되었다...
그래서 팀원과 의견을 나누던 중 Map을 이용해서 문제를 해결했다는 이야기를 듣고 Map을 통해서 문제를 해결해보기로 하였다.
function solution(array) {
var arr = array.sort((a,b) => a - b);
var m = new Map();
var count = 0;
var num = arr[0]
for (let i = 0; i < array.length; i++){
if(num === arr[i]){
m.set(arr[i],++count)
if(num !== arr[i + 1]){
count = 0
}
num = arr[i+1]
}
}
var arr2 = [...m].sort((a, b) => b[1] - a[1]);
return arr2.length === 1 || arr2[0][1] !== arr2[1][1] ? arr2[0][0] : -1
}
큰 로직은 이전과 비슷하다. 다만 단순하게 배열 자체를 for문으로 돌리면서 비교하는 것이 아니라.
for문 내에서 조건을 만족 할 경우 Map안으로 set 해주었다.
예) 1번을 예시로 들면
array 값이 [1, 2, 3, 3, 3, 4]가 주어졌을 때
생성된 맵의 모양은 다음과 같다.
{ 1 => 1, 2 => 1, 3 => 3, 4 => 1 }
즉 인덱스값 => 개수 의 구조로 Map 객체가 생성되었다.
이후에는 다시 Map객체를 풀어서 정렬해주고 삼항연산자를 사용해서 원하는 값을 return 시켜주었다.
Map에 대해서 강의를 통해서 배우긴 했었는데 어느 시점에 어떤 문제에 대해서 사용해야할지 감이 잘 오지 않았었다. 이 문제에서 Map을 사용하면서 복습도 되었고, 자료를 저장하는데에 Map이나 Set과 같이 객체, 배열이 아닌 다른 구조 사용의 유용성을 알 수 있었다.
이 문제에서는 Set은 어울리지 않다고 판단하였는데 차후에 다른 문제에 대해서 Set을 통하여 해결해 볼 예정이다.