본문 바로가기

Algorithm/Programmers

Programmers 120812 최빈값 구하기 Javascript

Problem

https://school.programmers.co.kr/learn/courses/30/lessons/120812

 

프로그래머스

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

programmers.co.kr

 

입력으로 주어진 배열에서 최빈값을 찾는 문제이다.

 

최빈값이 2개 이상일 시 -1을 리턴한다.


 

이 문제를 어떻게 해결할 까 생각해 보면

 

입력으로 주어진 배열은 자연수로 구성되어 있으므로

 

단순하게 카운트 배열을 하나 만들어 입력 배열에 존재하느 원소들을 카운트 해주고,

 

카운트 배열에서 가장 높은 카운트 값이 2개 이상이라면 -1을,

 

아니라면 그 값에 해당하는 수를 리턴하면 된다.


 

이것을 코드로 구현하면

const array = [1, 1, 2, 3, 4];
const freq = Array(1001).fill(0);

function solution(array) {
  array.map((e) => freq[e]++);
  let highest = 0;
  let index = -1;

  for (let i = 0; i <= 1000; i++) {
    if (freq[i] > highest) {
      highest = freq[i];
      index = i;
    }
  }

  let dup = 0;
  freq.forEach((e) => {
    if (e === highest) {
      dup++;
    }
  });

  if (index === -1 || dup > 1) {
    return -1;
  }

  return index;
}

console.log(solution(array));

 

먼저 전역변수 freq 배열을 1001사이즈로 만들고 fill 함수를 이용해 모두 0으로 초기화한다.

 

그리고  array에 map을 이용해여 각 원소에 해당하는 index의 freq 값을 하나씩 카운트 한다.

freq 배열의 index 값은 입력 array의 원소를 나타낸다. freq[1]의 값이 3이라면 array에 1이 3개 존재한다는 뜻이다.

 

이제 freq 배열을 루프하며 가장 높은 빈도를 highest에 저장하고 해당 값을 index에 저장한다.

 

그중복된 빈도의 값을 찾기 위해  freq 배열을 한 번 더 루프하며 highest 빈도의 개수를 dup에 저정한다. 

 

index가 -1이거나 (입력 배열이 비었을 경우) dup이 2 이상이면 (같은 빈도의 최빈값 존재) -1을 리턴하고

 

그 외에는 index를 리턴한다.

 

 

freq 배열의 index는 입력 배열 원소의 값과 일치한다.

Try

-  highest와 dup를 찾는 과정은 같은 배열 freq를 루프하므로 코드 리팩토링을 통해 두 반복문을 합칠 수 있을 것 같다.

 

- 입력 배열의 원소 값을 인덱스로 사용하는 freq를 만들었는데, 알고리즘 수업에서 들었던 dynamic programming과 관련이 있는 것 같다. 계속 문제를 풀며 개념을 잡아야 겠다.