프로그래머스 - 최빈값 구하기

이한결·2023년 1월 15일
0

프로그래머스

목록 보기
87/107
post-thumbnail

문제 설명

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

제한사항

● 0 < array의 길이 < 100
● 0 ≤ array의 원소 < 1000

입출력 예

입출력 예 설명

입출력 예 #1

[1, 2, 3, 3, 3, 4]에서 1은 1개 2는 1개 3은 3개 4는 1개로 최빈값은 3입니다.

입출력 예 #2

[1, 1, 2, 2]에서 1은 2개 2는 2개로 최빈값이 1, 2입니다. 최빈값이 여러 개이므로 -1을 return 합니다.

입출력 예 #3

[1]에는 1만 있으므로 최빈값은 1입니다.

나의 코드

   function solution(array) {
        let map = new Map();

        for (let i = 0; i <= Math.max(...array); i++) {
          map.set(i, 0);
        }

        for (let i = 0; i < array.length; i++) {
          map.set(array[i], map.get(array[i]) + 1);
        }

        let arr = Array.from(map.values());

        let max = Math.max(...arr);

        if (arr.indexOf(max) !== arr.lastIndexOf(max)) {
          return -1;
        } else {
          return arr.indexOf(max);
        }

문제가 헷갈리는 부분이 있는데 '입출력 예 #1'에서 최빈값이 3인 것은 3이 3번 반복되었기 때문에 3이 아니라 3번 반복된 값인 3이 반환된 것이다. 또한 '입출력 #3'에서 최빈값 역시 1의 값이 반환되야 한다. 만약 [3] 이렇게 된다면 3이 반환되어야 한다.

  1. 새로운 Map을 만든다.

  2. map.set()을 사용하여 array의 최대값까지 map을 초기화 시켜준다.

  3. 배열 원소값과 일치하는 Map의 value 값을 증가시켜준다.
    예를 들어 배열(array)이 [1, 2, 3, 4] 라고 할 때, Map에서는 {0 => 0, 1 => 1, 2 => 1, 3 => 1, 4 => 1} 이런 식으로 만들어진다.

  4. Array.from을 이용하여 Map 객체의 value로 배열을 만든다.

  5. 이전에 만든 배열인 arr에서 최대 값을 구한다.
    예를 들어, [1, 1, 1, 1] 여기 배열에서 최대 값은 1이 될 것이다.

  6. arr의 indexOf()와 lastIndexOf()의 값을 비교하여 같지 않으면 -1을 반환,
    같으면 indexOf()의 값을 반환한다.
    예를 들어, [1, 1, 1, 1] 여기 배열의 max값은 1이다. indexOf(1)은 1이고 lastIndexOf(1)은 4이다. 1과 4는 같지 않기 때문에 -1이 반환된다.

끝!

profile
평범한 삶을 위하여

0개의 댓글