[프로그래머스/js] 폰켓몬

김재훈·2023년 6월 14일
0

알고리즘 풀이

목록 보기
2/2

프로그래머스 고득점 Kit 해시 문제 중 하나인 폰켓몬 풀이입니다.

문제 설명

폰켓몬은 종류마다 자신의 종류 번호가 있고, nums라는 배열로 폰켓몬 종류 번호가 담긴 배열을 제공 받습니다. nums = [3,1,2,3]과 같이 넘어오면 3번 폰켓몬 2마리, 1,2번 폰켓몬이 각각 1마리씩 있다는 의미입니다.

우리는 폰켓몬을 반마리만 고를 수 있습니다. 위에 nums로 제공 받은 폰켓몬은 총 4마리이므로, 우리가 고를 수 있는 폰켓몬은 2마리입니다.

우리는 고를 수 있는 폰켓몬 중 최대한 많은 종류의 폰켓몬을 고르려고 합니다. 즉 중복되는 선택의 조합은 피해야 합니다.

나의 풀이

가장 많은 종류의 폰켓몬 조합은 결국 중복되는 수를 제외한 모든 폰켓몬 조합입니다.
중복되는 수를 모두 제거한 배열의 크기가 우리가 최대한 다양하게 고른 경우의 수와 동일할 것입니다.
하지만 우리가 고를 수 있는 폰켓몬의 마리 수는 최대 반마리로 제한되어 있습니다.

따라서 중복을 제거한 배열의 크기가 반마리로 제한된 마리 수보다 크다면 반마리를 반환하고,
작다면 중복을 제거한 배열의 크기를 반환하면 됩니다.

이를 코드로 표현하면 다음과 같습니다.

function solution(nums) {
    // 중복을 제거하기 위해 Set 객체로 만듬
    const uniqueSpecies = new Set(nums);
    
    // Set 객체의 크기와 반마리의 값을 각각 변수로 저장
    const species = uniqueSpecies.size;
    const halfOfNums = nums.length / 2;
    
    // 그 둘을 비교해서 더 작은 값을 반환
    return (halfOfNums > species) ? species : halfOfNums;
}

다른 사람의 풀이

다른 사람의 풀이는 오히려 불필요하게 배열로 다시 반환하는 과정을 거쳤는데요. 그 외에 특이하게 다른 접근법은 없어서 이번 문제에서 추가로 개선할 사항은 없습니다.

function solution(nums) {
  const max = nums.length / 2;
  const arr = [...new Set(nums)];

  return arr.length > max ? max : arr.length
}

감사합니다.

profile
개발하면서 새롭게 배운 내용, 시행착오한 내용들을 잊지 않기 위해 기록합니다.

0개의 댓글