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 |
|---|