javascript/프로그래머스

폰켓몬

jjaehhoneo 2025. 9. 22. 17:35

https://school.programmers.co.kr/learn/courses/30/lessons/1845

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

들어가기 전 생각 

N마리중 절반만큼 선택을 하는 것이고, 종류는 겹칠 수 없다고 한다. 종류가 겹칠 수 없으면 집합의 개념이 사용될 것이다.

고를 수 있는 포켓몬의 최댓값은 배열의 절반 인 N/2 여야한다. (N은 무조건 짝수로만 주어진다.) 최솟값은 배열을 집합으로 새로 정의하고, 그 집합의 크기가 된거나 N/2일 것이다. 이는 Math.min()함수로 찾아서 return하면 될 것이다.

 

집합

집합은 어떤 명확한 조건을 만족시키는 서로 다른 대상들의 모임이다. 자바스크립트에서는 Set(배열) 을 통해서 선언했다.

이 문제를 풀 때 소요시간이 짧아, 자바스크립트에서 쓰이는 집합의 연산들인  합집합,교집합 , 차집합, 대칭차집합을 정리해보았다.

 

합집합

사실 합집합은 두 집합을 서로 추가만 해 주고 set을 해주면 자동으로 겹치는 내용을 빼 주기 때문에 A + B - A ∩ B 를 해 줄 필요는 없다. 

const arr1 = [1, 2, 3];
const arr2 = [3, 4, 5];

const result = [...new Set([...arr1, ...arr2])];

console.log(result); //[1,2,3,4,5]

 

 

교집합

filter를 통해 한 집합과 다른 한 집합이 겹치게 갖고 있는 것을 찾으면 된다.

const arr1 = [1, 2, 3];
const arr2 = [3, 4, 5];

const result = arr1.filter((x) => arr2.includes(x)); //[1,2]
console.log(result);

 

차집합

합집합의 add()메소드를 delete()로 바꾸면 된다. 기본적인 개념은 A - B 로, A B^c 로 나타낼 수 있는데, 이를 filter를 사용해 표현한다.

const arr1 = [1, 2, 3];
const arr2 = [3, 4, 5];

const result = arr1.filter((x) => !arr2.includes(x)); //[1,2]
console.log(result);

 

대칭차집합(배타적논리합)

A-B B-A 의 결과와 같다

const arr1 = [1,2,3]
const arr2 = [3,4,5]

const result = arr1
.filter(x => !arr2.includes(x))
.concat(arr2.filter(x => !arr1.includes(x))); // concat은 배열 합치기

console.log(result) //[1,2,4,5]

 

집합의 연산을 알아보았고, 밑은 본론으로 돌아온 코드 전문이다.

function solution(nums) {
    const set = new Set(nums);
    return Math.min(nums.length / 2, set.size);
}

 

 

 

'javascript > 프로그래머스' 카테고리의 다른 글

중앙값 구하기  (0) 2025.09.19