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

Janet·2023년 3월 29일
0

Algorithm

목록 보기
94/314

문제 설명

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


제한사항

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

입출력 예

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입니다.

※ 공지 - 2022년 10월 17일 제한 사항 및 테스트케이스가 수정되었습니다.


문제풀이

💡 문제풀이 과정

  • 주어진 배열 array의 원소들과 중복값이 제거된 배열을 만들어 같으면 각각의 원소가 같으면 count++해주기로 한다. 따라서 중복값을 제거한 배열을 […new Set(array)]를 통해 만들어 준다. setArr라는 빈 배열에 중복 제거된 원소들과 카운트할 원소를 함께 넣어주기로 한다. setArr의 원소의 인덱스 0은 array에서 가져온 원소(정수)가 되고, 인덱스 1은 count할 자연수가 들어간다. 즉, [[array원소1, count], [array원소2, count]]와 같은 2차원 배열의 형태가 된다. (다음 코드 참고)
let setArr = [];
let count = 0;
    
[...new Set(array)].map((v) => setArr.push([v, count]));
  • 다음은, for() 반복문을 중복으로 사용하여 array[i]setArr[j][0]을 비교하여 같으면 setArr[j][1]++한다.
for (let i = 0; i < array.length; i++) {
  for (let j = 0; j < setArr.length; j++) {
     if (array[i] == setArr[j][0]) setArr[j][1]++;
  }
}
  • 다음은, setArrcount가 들어있는 원소를 기준으로 내림 차순 정렬한다. 즉, 제일 카운트가 높은 순서대로 정렬하여 맨 위의 원소가 최빈값이 들어있는 원소가 된다. setArr.sort((a, b) => b[1] - a[1]);
  • 마지막으로는, 조건문을 통해 세 가지 조건을 만든다.
    1. 만약 주어진 배열 array의 원소가 1개인 경우 혹은 setArr의 원소가 하나인 경우에는 array[0]를 리턴한다. 만약 주어진 array[1, 1, 1, 1]인 경우에는 new Set(array)을 이용하여 중복 제거했을 때 배열의 원소가 하나만 남기때문이다.
    2. 최빈값이 여러 개일 경우이다. setArr에 담긴 첫 번째 원소의 카운트 값두 번째 원소의 카운트 값이 같을 경우 -1을 리턴한다. (sort()를 통해 카운트값을 기준으로 내림 차순했기 때문에, 첫 번째 원소와 두 번째 원소만 비교하면 된다.)
    3. 위 2가지 경우를 제외하고 나머지는 setArr에 담긴 첫 번째 원소의 정수를 리턴하면 된다. (이 역시 sort()를 통해 내림 차순 정렬하였기 때문에 첫 번째 원소가 최빈값이 된다.)
if (array.length == 1 || setArr.length == 1) return array[0];
else if (setArr[0][1] == setArr[1][1]) return -1;
else return setArr[0][0];

  • 답안 2번의 경우 다른 사람의 풀이를 가져왔는데, new Map()과 관련 메소드를 사용하여 풀이한 것이 인상 깊다.

✅ 답안 #1

function solution(array) {
  let setArr = []
  let count = 0;

  [...new Set(array)].map((v) => setArr.push([v, count]));

  for (let i = 0; i < array.length; i++) {
    for (let j = 0; j < setArr.length; j++) {
      if (array[i] == setArr[j][0]) setArr[j][1]++;
    }
  }

  setArr.sort((a, b) => b[1] - a[1]);

  if (array.length == 1 || setArr.length == 1) return array[0];
  else if (setArr[0][1] == setArr[1][1]) return -1;
  else return setArr[0][0];
}

✅ 답안 #2

function solution(array) {
    let m = new Map();
    for (let n of array) m.set(n, (m.get(n) || 0)+1);
    m = [...m].sort((a,b)=>b[1]-a[1]);
    return m.length === 1 || m[0][1] > m[1][1] ? m[0][0] : -1;
}
profile
😸

0개의 댓글