본문 바로가기
기초다지기/JS 코딩테스트

javaScript 배열 중복 처리하기

by 김빵그 2023. 12. 20.

문제 

 한 상자에 담으려는 귤의 개수 k와 귤의 크기를 담은 정수 배열이 주어질 때, 서로 다른 종류의 수를 최소화해 크기가 서로 다른 종류의 수의 최소값을 구하여라

풀이 

function solution(k, tangerine) {
    const countMap = {};
    tangerine.forEach(num => {
        countMap[num] = (countMap[num] || 0) + 1;
    });
    console.log(countMap);
    const sortedArray = tangerine.sort((a, b) => {
    const countA = countMap[a];
    const countB = countMap[b];

    if (countA === countB) {
      return a - b; 
    } else {
      return countB - countA; 
    }
  });

  return [...new Set(sortedArray.slice(0, k))].length; 
}
  • 중복 횟수 계산 (countMap) 
    • 정수 배열 tangerine을 순회하며 각 숫자의 등장 횟수를 countMap 객체에 저장 
    • num이라는 키가 이미 존재한다면 (countMap[num] || 0 부분에서 기존의 값 사용 
    • undefined 이거나 null이라면 0이라는 기본값 사용
    • 전체 구문에서는 1을 더해 새로운 값으로 업데이트
  • 배열 정렬 (sortedArray)
    • countA === B : 중복 횟수가 같으면 작은 숫자가 앞에 오도록 정렬 
    • 중복 횟수가 다르면 중복 횟수가 많은 순서로 정렬
  • 상위 k개 추출 및 중복 제거
    • 정렬된 배열에서 상위 k개를 추출한 후 new Set을 사용하여 중복된 숫자 제거
    • 중복 제거한 배열의 길이를 반환

다른 풀이

function solution(k, tangerine) {
  let answer = 0;
  const tDict = {};

  // 각 숫자의 등장 횟수를 세는 객체 생성 (tDict)
  tangerine.forEach((t) => tDict[t] = (tDict[t] || 0) + 1);

  // 등장 횟수를 기준으로 내림차순 정렬된 배열 생성 (tArr)
  const tArr = Object.values(tDict).sort((a, b) => b - a);

  // 상위 k개의 중복된 숫자의 개수를 계산
  for (const t of tArr) {
    answer++;
    if (k > t) k -= t;
    else break;
  }

  return answer;
}
  •  for of
    • 정렬된 배열 tArr를 순회하며 상위 k개의 중복된 숫자 계산 
    • answer 변수에 상위 k개의 서로 다른 중복 숫자의 개수가 저장 
    • k가 현재 숫자의 등장 횟수(t)보다 크면 k에서 t를 빼고, k가 작아지면 더 이상 중복된 숫자를 포함시킬수 없어 반복 종료 
  •