[JS] 해시 > 폰켓몬
function solution(nums) {
var length = nums.length/2;
var answer = 0;
var map = new Map();
for(var i = 0; i < nums.length; i++){
map.set(nums[i], map.get(nums[i]) + 1 || 1);
}
return answer = length < map.size ? length : map.size;
}
내가 푼 코드
총 n마리의 포켓몬이 있으면 그 중 n/2 마리만 가져갈 수 있기 때문에 n마리의 폰켓몬을 담은 nums의 배열을 2로 나눠 변수에 저장했다.
map으로 문제를 풀어보았는데 for문을 배열의 길이만큼 돌리면서 map에 값을 담아줬다
key는 폰켓몬의 번호로, value는 폰켓몬번호(nums[i])를 가져와 +1을 해줬고 그 번호가 map에 없다면 1을 지정해줬다.
nums가 [3,1,2,3]이라면 map에 넣을 때, nums[i]로 가져온 3은 map에 없는 번호이기 때문에 1이 들어가고, 1과 2도 1씩 들어가진다.
nums[3]인 3번이 다시 map에 들어갈 때 번호 3은 이미 map에 저장되어 있어서 +1가 되어 2가 된다.
리턴값은 배열의 길이/2 즉, 내가 가져갈 수 있는 폰켓몬의 수가 폰켓몬의 종류보다 적다면 내가 가져갈 수 있는 최대 폰켓몬의 종류는 length와 일치한다.
반대라면 폰켓몬의 종류별로 가져가는 것이 내가 최대로 가져갈 수 있는 방법이다.
예를 들어 nums[3,1,2,3]에서 내가 가져갈 수 있는 폰켓몬은 2마리, 폰켓몬의 종류는 3종류다. 이 경우 나는 1번-2번, 2번-3번, 1번-3번 이런식으로 2종류의 폰켓몬만을 데려갈 수 있다.
nums가 [3,3,3,2,2,2]라면 내가 가져갈 수 있는 폰켓몬은 3마리, 폰켓몬 종류는 2종류다. 이 경우에는 2번, 3번 폰켓몬은 한 마리씩 데려가고 남은 한 마리는 2번이든 3번이든 상관이 없다. 때문에 최대로 가져갈 수 있는 폰켓몬 종류는 2종류다.
function solution(nums) {
const max = nums.length / 2;
const arr = [...new Set(nums)];
return arr.length > max ? max : arr.length
}
다른 사람 풀이
중복을 허용하지 않는 자료구조인 Set을 이용해서 풀었다.
nums배열을 Set에 담고 전개연산자(...)를 이용해 다시 배열에 담아줬다.