티스토리 뷰

반응형

 

프로그래머스 -폰켓몬

 

조금 수월하게 푼 문제는 포스팅까지 하지는 않는데 제출 후 다른 분 답변을 보고 실행해봤더니 훨씬 더 많은 테스트케이스일 경우에 처리속도가 현저히 빨랐다. 중복된 값을 제거해주는 Set 객체를 이용한 연산이었다.

 

나도 한 번 더 생각했으면 내가 쓴 코드에서 value값을 쓰지 않았다는 것을 알았을 텐데..! 하는 생각에 좀 아쉬웠다.

 

 


 

풀이 과정

*nums개수는 짝수이기 때문에 1개인 경우는 생각하지 않아도 됨.
1. 가질 수 있는 인형 개수 구하기 let getToyCount = nums/2 = 3
2. 똑같은 인형의 개수가 얼마큼 있는지 분류해주자.
3. maxCount를 구하자
3.1 key의 개수와 maxCount와 같은가? > count가 key개수보다 크거나 같을 때 성립된다.
3.2 그럼 count가 key개수보다 작을 때는? count가 maxCount가 된다.
4. maxCount 리턴

 

 

제출 답안 

원래 삼항 연산자 안 쓰고 if문으로 제출했다가 생각해보니 삼항 연산자로도 될 것 같아서 수정했다. 

여기서 나는 sortedToys에서  value값을 쓰지 않았다. 여기서 한 번 더 생각했으면 아래처럼 더 효율적인 코드가 나왔을 것 같다.

function solution(nums) {
  const getToyCount = nums.length / 2;

  const sortedToys = nums.reduce(
    (dic, key) => ((dic[key] = dic[key] ? dic[key] + 1 : 1), dic),
    {}
  );

  const keySize = Object.keys(sortedToys).length;

  const maxCount = getToyCount >= keySize ? keySize : getToyCount;

  return maxCount;
}

 

 

 

Set객체를 이용한 답안 

이분은 문제를 한 단계 더 파고든 것 같다. 나도 key를 분류해주고 나서 key의 개수를 연산에 사용했지 value값은 전혀 쓰지 않았는데 왜 이런 생각을 못했을까 

 

사실 value값을 쓰지 않다면 Set을 통해 중복된 값만 제거해주고 그 길이를 key의 개수(서로 다른 인형의 개수)라고 생각해도 전혀 이상 없다.

 

배우자.. 제출 전 한 번 더 쓰지 않은 값이 있었는지 생각하자.

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

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




반응형