본문 바로가기

알고리즘

최빈수 구하기 - (프로그래머스 코딩테스트 입문)

문제 설명

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

입출력 예

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

문제 풀이

function solution(array) {
    var answer = 0;
    var arr = [...new Set(array)] 
    //new Set 메서드로 원시값(string, number, bigint, bollean, undefined, symbol, null)과 객체 참조, 모든유형의 유일한 값을 저장할 수 있다. 
    // => 즉, 중복된 값이 있으면 한개만 유일하게 남겨줌(중복허용X)
    
    var count_arr = []
    
    // 반복문을 돌려 arr의 수와 array의 수를 비교해 같으면 count_arr에 할당한다. 
    for(var i = 0; i< arr.length; i++){
        var count = 0
        for(var j = 0 ; j<array.length; j++){
            if(arr[i] === array[j]){
                count++
            }
        }
        count_arr.push(count) 
        // count_arr 배열안에 할당한다. 
    }
    
    // count_arr 배열안에서 가장 큰 값을 찾는다. 
    var max = Math.max(...count_arr)
    // 가장 큰 값인 max의 인덱스 번호를 찾는다. 
    var j = count_arr.indexOf(max)
    
    // 가장 큰값의 위치를 찾아 answer의 값으로 할당한다. 
    answer = arr[j]    

    for(var i = 0; i<arr.length; i++){
        // count_arr의 숫자중 가장 큰 값과 같고 
        //i의 값이 j과 다르다면 answer에 -1을 할당하라.
        if(count_arr[i] === max && i != j){
            answer = -1
        }
    }
    
    return answer;
}

reduce함수

reduce(func, initialValue)는 배열 요소의 값들을 순차적으로 순회하면서 하나의 값을 만드는 함수다. 초기값 initialValue가 주어지면, 배열의 0번 index 부터 연산을 수행하고, 그 결과를 다음 연산의 인자(accumlator)로 전달한다.

아래 예제는 reduce()로 중복을 제거하는 방법인데, accumulator에 추가 안된 요소라면 추가하고, 그렇지 않으면 추가 하지 않는다. 이것을 첫번째 요소부터 마지막 요소까지 순회하면서 수행한다.

const arr = ['A', 'B', 'C', 'A', 'B'];
const initialValue = []

const newArr = arr.reduce((acc, obj) => acc.includes(obj)
 ? acc : [...acc, obj],initialValue)

console.log(newArr)

 

 

 

 

🚀 틀린점이 있어 지적할 사항이 있다면, 피드백해주시면 감사하겠습니다. 😊