[프로그래머스 / JS] Lv.0 최빈값 구하기

SOYEON JEONG·2023년 3월 4일
0

문제 설명

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

입출력 예시

입출력 예 #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 countObj = {}; // array 원소가 몇 번 나왔는지 알 수 있는 카운트 객체
  let maxCount = 0; // 객체에서 가장 큰 값을 찾는 변수 선언
  let modes = []; // maxCount인 num을 저장하는 배열

  for (let i = 0; i < array.length; i++) {
    const num = array[i]; // 배열의 원소를 num에 담아준다.
    // 현재 원소가 countObj 객체에 있는지 확인. 
    // 있으면 key값에 num이 들어가고, value를 1 증가시키고, 없으면 value를 1로 초기화
    countObj[num] = countObj[num] ? countObj[num] + 1 : 1;
    
    if (countObj[num] > maxCount) {
      // 현재 숫자의 빈도수(value)가 최대 빈도수보다 크면
      // 최대 빈도수 값을 업데이트하고 modes 배열을 현재 숫자로 초기화
      maxCount = countObj[num];
      modes = [num];
    } else if (countObj[num] === maxCount) {
      // 현재 숫자의 빈도수(value)가 최대 빈도수와 같으면,
      // modes 배열에 현재 숫자를 추가합니다.
      modes.push(num);
    }
  }

  // modes 배열의 길이가 1보다 크면 최빈값이 여러 개이므로 -1을 반환
  // 그렇지 않으면 modes 배열의 첫 번째 원소를 반환
  return modes.length > 1 ? -1 : modes[0];
}

과정

  1. array의 값이 같을 때마다 Count할 것 -> 객체 {key : value}에 담아주기
  2. 객체(카운트 대상 숫자 num = key)에 (빈도수 = value)에서 가장 큰 값을 찾기
  3. 반복문을 통해 인덱스 하나씩 조건문에 맞는지 대입해보기.
  4. Count 용도의 조건문 - 객체의 key 값이 이전 값과 같으면 value에 +1 아니면 1로 초기화
  5. 빈도수 확인의 조건문 - count된 value를 확인하고 변수 maxCount보다 더 클 때 할당, 빈도수가 최대일 때 현재의 숫자를 modes에 넣어 배열 [0]를 초기화
  6. 같은 빈도수 확인의 조건문 - 만약 이전의 value가 maxCount에 할당된 값과 같다면 배열의 다음 방에 push()
  7. return - modes 배열에 빈도수가 같은 숫자가 있었다면 배열 길이가 1보다 크므로 -1 반환,
    아니면 하나뿐인 배열 원소 num을 반환.

개선

  1. 객체에 카운팅해서 key:value로 할당할 생각
  2. 배열 내장 함수에 대한 이해도
  3. 자유로운 조건문 사용

추가

  1. push() : 배열에 새로운 원소를 추가하는 메소드
  2. 객체의 형태 : objectName{key:value}, objectName[key] = value
  3. 객체의 활용 : 변수 = [key], 변수 = objectName[key]
profile
인프런에 취업하고 싶어!

0개의 댓글