TIL_2023.05.26

이얏호·2023년 5월 26일
0
post-custom-banner

프로그래머스 최빈값 문제이다.

우선 로직을 생각해보았는데,
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을 통하여 해결해 볼 예정이다.

profile
열심히 신나게 화이팅!
post-custom-banner

0개의 댓글