[문제풀기] 프로그래머스 최빈구하기

yeols·2023년 9월 20일
0

Algorithm

목록 보기
6/16
post-thumbnail

프로그래머스 최빈구하기

문제 설명

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


입출력 예

arrayresult
[1, 2, 3, 3, 3, 4]3
[1, 1, 2, 2-1
[1]1

입출력 예

입출력 예 #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 obj = {};
  // for문 반복하면서 obj에 현재 숫자와 같은 프로퍼티가 없으면 0 + 1을
  // 있을 경우 obj[arrayElement+''] + 1을 한다.
  for (const arrayElement of array) {
    obj[arrayElement + ''] = (obj[arrayElement + ''] || 0) + 1;
  }

  let arr = Object.values(obj);
  let maxValue = Math.max(...arr);
  arr.splice(arr.indexOf(maxValue), 1);
  maxValue = (arr.includes(maxValue)) ? -1 : maxValue;

    return maxValue;
}

문제 풀이 해설

  1. array에 담긴 요소들을 key에 담고 value에는 중복된 횟수만큼 증가시킨다.
  // 배열에 요소 
  let obj = {};
  // for문 반복하면서 obj에 현재 숫자와 같은 프로퍼티가 없으면 0 + 1을
  // 있을 경우 obj[arrayElement+''] + 1을 한다.
  for (const arrayElement of array) {
    obj[arrayElement + ''] = (obj[arrayElement + ''] || 0) + 1;
  }
  • 입력받은 array를 for ... of 문법을 사용하여 반복해서 값을 꺼내온다.
  • obj[arrayElement + '']를 통해 obj에 프로퍼티가 없다면 프로퍼티를 생성한다.
  • (obj[arrayElement + ''] || 0) + 1obj에 프로퍼티가 있다면 그 프로퍼티의 value에 +1을 하고 없으면 0에 +1을 한다.
  1. obj의 value들을 배열로 변경 후 최대값 추출한다.
  let arr = Object.values(obj);
  let maxValue = Math.max(...arr);
  • let arr = Object.values(obj);obj에 담긴 value를 Object.values()메서드를 통해 objvalue값만 있는 배열로 return 받는다.
  • let maxValue = Math.max(...arr); Math.max()메서드에 obj의 value만 갖는 배열을 스프레드 문법을 이용해 인수를 전달하면
    전달된 인수에서 가장 큰값을 return 해 준다.
  1. 2번에서 생성한 arr에서 max값을 제거 한 후 다시 배열에 최대값이 있는지 확인
arr.splice(arr.indexOf(maxValue), 1);
maxValue = (arr.includes(maxValue)) ? -1 : maxValue;
  • arr.splice(arr.indexOf(maxValue), 1); 2번에서 생성한 arr에 찾은 max값을 Array.prototype.indexOf메서드를 사용해 찾고 Array.prototype.splice를 사용해 삭제한다.
    -maxValue = (arr.includes(maxValue)) ? -1 : maxValue; Array.prototype.includes를 사용해 max값이 더 있는지 확인하고 있으면 -1을 아니면 max값을 maxValue에 담는다.
  • 최종적으로 maxValue를 결과값으로 return한다.

다른 사람의 문제 풀이

const solution = (array) => {
    const counter = array.reduce((acc, cur) => ({
        ...acc,
        [cur]: (acc[cur] || 0) + 1
    }), {})

    const items = Object.keys(counter).map((key) => [
        Number(key), counter[key]
    ]).sort((a, b) => b[1] - a[1])

    if (items[0][1] === items?.[1]?.[1]) {
        return -1
    }

    return items[0][0];
}

문제를 풀고 후기

최종 합격은 하지 못했다.
다른 사람의 문제풀이를 보니 아직 배열의 메서드 이해가 부족하고 모르는게 많았다.
우선 자료구조들의 수많은 메서드를 공부를 하고 위의 문제를 다시 풀어보면 좋을거같다.

다른 사람의 문제 풀이 보고 느낀점

위 문제 풀이를 아직 다 이해하지 못했다.
reduce메서드를 아직 공부 전이고 map메서드와 sort메서드를 사용한 것을 볼 수 있다.
지금의 나의 실력은 아직 위 메서드를 쓸 생각을 못했다.
다른 이들이 풀이한 것을 자주 보는것도 많은 자극과 도움이 되는거같다.


요약

일단 딥 다이브 책부터 펴자...

profile
흠..

0개의 댓글