🙌문제설명
당신은 폰켓몬을 잡기 위한 오랜 여행 끝에, 홍 박사님의 연구실에 도착했습니다. 홍 박사님은 당신에게 자신의 연구실에 있는 총 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 함수를 완성해주세요.
☑️나의 풀이
function solution(nums) {
let Map = [...new Set(nums)];
let limit = nums.length/2;
return Map.length > limit ? limit : Map.length;
}
❓해시로 푸는 방법
function solution(nums) {
let ans = 0;
let arr = new Map();
nums.forEach((key)=>{
if(arr.get(key)) arr.set(key, arr.get(key)+1);
else arr.set(key,1);
})
return arr.size < nums.length/2 ? arr.size : nums.length/2;
}
☑️배운 점
forEach 메서드
각 배열 요소에 대해 제공된 함수를 한번씩 실행
set 객체
중복되지 않는 유일한 값들의 집합
교집합, 합집합, 차집합, 여집합등을 구현하는 것이 가능
배열과 다른점? 인덱스 X, 순서 X, 중복 X
cosnt set = new Set(); //생성
//추가(중복 X)
set.add(1).add(2);
console.log(set); // Set(2) {1,2}
//존재 확인
console.log(set.has(2)); // true
console.log(set.has(4)); // false
//순회
set.forEach((v, v2, set) => console.log(v, v2, set));
// 1 1 Set(2) {1, 2}
// 2 2 Set(2) {1, 2}
//삭제
set.delete(1);
console.log(set); // Set(1) {2}
//일괄삭제
set.clear();
console.log(set); // Set(0) {}
//사용법
const set1 = new Set([1, 2, 3, 3]);
console.log(set1); // Set(3) {1, 2, 3}
const set2 = new Set('hello');
console.log(set2); // Set(4) {"h", "e", "l", "o"}
// Set을 사용한 배열의 중복 요소 제거
const uniq = array => [...new Set(array)];
console.log(uniq([2, 1, 2, 3, 4, 3, 4])); // [2, 1, 3, 4]
#참고
중복 제거할때 Set 객체 사용하기