본문 바로가기

CS/알고리즘

[230323] 최빈값 구하기

반응형

 

 

문제

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


 

 

예전 풀이

function solution(array) { 
    if(array.length === 1) return array[0];
    
    const obj = {}
    for(let i = 0; i < array.length; i++){
        obj[array[i]] = (obj[array[i]] || 0) + 1;
    }
    
    let max_num = -Infinity;
    let result = -1;
    
    const valuesArr = Object.values(obj);
    const max = Math.max(...valuesArr);
    if(valuesArr.indexOf(max) !== valuesArr.lastIndexOf(max)) return -1;
    
    for(let key in obj) { 
        if(obj[key] > max_num) {
            max_num = obj[key];
            result = +key;
        }
    }
    
    return result;
}

 

 

최근 다시 풀이

  1. 중복 없이 오름차순으로 정렬한 배열 = sortedArray
  2. 오름차순으로 숫자의 개수를 저장하는 배열 생성 = answer
  3. → 중복 없는 숫자(요소의 개수)만큼 배열 만들고, 거기에 0으로 채움
  4. array의 크기만큼 for문을 돌리고,
    1. array의 각 요소를 sortedArray에서 몇 번째 인덱스 인지 찾고
    2. answer의 그 인덱스에 +1을 더함
  5. answer의 최댓값을 구함 = max
  6. answer에서 max가 여러개라면 -1를 반환
  7. answer에서 max를 담은 index === 최빈값의 인덱스
  8. → sortedArray[최빈값의 인덱스] === 최빈값!
function solution(array) {
    if(array.length === 1) return array[0];

    const sortedArray = [...new Set(array)].sort((x, y) => x - y) 
    const answer = new Array(sortedArray.length).fill(0);
    
    for(let i = 0; i < array.length; i++) {
        const idx = sortedArray.indexOf(array[i]); 
        answer[idx] += 1;
    }
    
    const max = Math.max(...answer);
    if(answer.indexOf(max) !== answer.lastIndexOf(max)) return -1;
    return sortedArray[answer.indexOf(max)];
}
반응형

'CS > 알고리즘' 카테고리의 다른 글

[230325] 최솟값 만들기  (0) 2023.03.26
[230323] 둘만의 암호  (0) 2023.03.26
[230323] 유한소수 판별하기: toFixed  (0) 2023.03.26
[230322] 등수 매기기: indexOf  (0) 2023.03.26
[230321] 특이한 정렬  (0) 2023.03.26