JS _ Set (feat.폰켓몬)

돌리의 하루·2023년 10월 1일
0

오늘은 짜잔 Set에 대해 알아볼것이다!

배우게 된 계기는 프로그래머스의 알고리즘 폰켓몬이다! 🐈

우선 폰켓몬의 문제부터 보자.

문제 설명

당신은 폰켓몬을 잡기 위한 오랜 여행 끝에, 홍 박사님의 연구실에 도착했습니다. 홍 박사님은 당신에게 자신의 연구실에 있는 총 N 마리의 폰켓몬 중에서 N/2마리를 가져가도 좋다고 했습니다.
홍 박사님 연구실의 폰켓몬은 종류에 따라 번호를 붙여 구분합니다. 따라서 같은 종류의 폰켓몬은 같은 번호를 가지고 있습니다. 예를 들어 연구실에 총 4마리의 폰켓몬이 있고, 각 폰켓몬의 종류 번호가 [3번, 1번, 2번, 3번]이라면 이는 3번 폰켓몬 두 마리, 1번 폰켓몬 한 마리, 2번 폰켓몬 한 마리가 있음을 나타냅니다. 이때, 4마리의 폰켓몬 중 2마리를 고르는 방법은 다음과 같이 6가지가 있습니다.

첫 번째(3번), 두 번째(1번) 폰켓몬을 선택
첫 번째(3번), 세 번째(2번) 폰켓몬을 선택
첫 번째(3번), 네 번째(3번) 폰켓몬을 선택
두 번째(1번), 세 번째(2번) 폰켓몬을 선택
두 번째(1번), 네 번째(3번) 폰켓몬을 선택
세 번째(2번), 네 번째(3번) 폰켓몬을 선택

이때, 첫 번째(3번) 폰켓몬과 네 번째(3번) 폰켓몬을 선택하는 방법은 한 종류(3번 폰켓몬 두 마리)의 폰켓몬만 가질 수 있지만, 다른 방법들은 모두 두 종류의 폰켓몬을 가질 수 있습니다. 따라서 위 예시에서 가질 수 있는 폰켓몬 종류 수의 최댓값은 2가 됩니다.
당신은 최대한 다양한 종류의 폰켓몬을 가지길 원하기 때문에, 최대한 많은 종류의 폰켓몬을 포함해서 N/2마리를 선택하려 합니다. N마리 폰켓몬의 종류 번호가 담긴 배열 nums가 매개변수로 주어질 때, N/2마리의 폰켓몬을 선택하는 방법 중, 가장 많은 종류의 폰켓몬을 선택하는 방법을 찾아, 그때의 폰켓몬 종류 번호의 개수를 return 하도록 solution 함수를 완성해주세요.

제한사항

  • nums는 폰켓몬의 종류 번호가 담긴 1차원 배열입니다.
  • nums의 길이(N)는 1 이상 10,000 이하의 자연수이며, 항상 짝수로 주어집니다.
  • 폰켓몬의 종류 번호는 1 이상 200,000 이하의 자연수로 나타냅니다.
  • 가장 많은 종류의 폰켓몬을 선택하는 방법이 여러 가지인 경우에도, 선택할 수 있는 폰켓몬 종류 개수의 최댓값 하나만 return 하면 됩니다.

나의 풀이

function solution(nums) {
    //배열에서 같은거면 제외하고 넣는다. 즉, 다른 원소만 모아놓는 배열을 만들것
    let answer = []
    for(let i = 0; i<nums.length; i++){
       if(!answer.includes(nums[i]))answer.push(nums[i])
    }
   if((nums.length/2) >= answer.length)return answer.length
    else if((nums.length/2) < answer.length){
        return (nums.length/2)
    }
}

요렇게 해서 통과~는 됐지만!

세세히 뜯어보면, 그다지 좋은 코드는 아니다.

  1. 내가 쓴 includes() 메서드는 배열의 모든 요소들을 일일히 확인한다.
    (배열이 크면 클수록 더욱 시간이 많이 걸린다)
  2. 원래 있던 배열을 2차적으로 만들어내는 작업이다.
  3. 사용하는 메서드는 배열의 모든 요소에 대해서 실행하기 때문에 전체 시간 범위도에서 좋지 않다.

이러한 이유로~ 다른 사람의 풀이를 보고! 좋은 방법을 찾을 수 있었다.

~다른 사람의 풀이~

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

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

여기서 Set에 대해 알 수 있었다!
Set의 특징에 대해 알아보면,

  1. set은 다른 값을 사용할 수 없다. 즉, 같은 값을 여러 번 추가하면 한 번만 저장된다.

요런 특징이 있어서 한 번 실험해봤다!

(중간에 syntaxerror는 무시해주세용..)

이런식으로 잘 들어오는걸 확인했다!

set은 시간 복잡도 면에서도 효율적이고, 사용하면 코드도 훨씬 간결해지니 보기에도 깔끔하다~

풀이방법 한 개 때문에 전체적인 코드가 간략해지는 걸 보니 싱기방기,,

오늘은 여기서 끄읏 ^~^

profile
진화중인 돌리입니다 :>

0개의 댓글