
문제가 길어 link로 걸어두고 밑에는 문제를 풀기 위한 간단한 설명을 하겠습니다.
링크 : https://school.programmers.co.kr/learn/courses/30/lessons/1845?language=javascript
배열 nums를 파라미터로 전달 받습니다.
Ex ) nums : [3, 1, 2, 3]
배열에는 포켓몬의 번호가 달려있습니다.
즉,
3번 포켓몬 : 2개
1번 포켓몬 : 1개
2번 포켓몬 : 1개
이 중 N/2개인 2개를 주어야 합니다.
주어야 하는 포켓몬 중 최대한 겹치지 않게 주는 포켓몬의 종류를 구하는 문제입니다.
생각보다 간단한 문제입니다.
최빈값을 구하는 문제와 사실상 유사하다고 볼 수 있습니다.
만약, 포켓몬의 종류보다 주어야 하는 개수가 많다면 포켓몬을 다 다른 종류대로 줄 수 있다는 것입니다.
따라서 N/2개의 서로 다른 포켓몬을 줄 수 있다는 것입니다.
그렇지 않고, 포켓몬의 종류가 주어야 하는 포켓몬보다 작다면 줄 수 있는 종류는 포켓몬의 종류일 것입니다.
즉, 포켓몬의 있는 종류 다 주면 됩니다.
같다면 어떨까요 ? 포켓몬 종류를 다 주든 N/2개의 서로 다른 포켓몬을 주든 상관이 없을 것입니다.
[3, 1, 2, 3]
1 : 1
2 : 1
3 : 2
N/2 : 2
즉, 1, 2, 3 중 아무거나 주어도 된다는 것입니다.
N/2만 만족하면 되므로 2개를 줄 수 있습니다.
[1, 1, 1, 2, 2, 2]
1 : 3
2 : 3
N/2 : 3
3개를 주어야 하지만 종류가 2개 밖에 없습니다. 따라서 줄 수 있는 포켓몬의 종류는 2입니다.
사용할 자료구조는 map입니다.
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Map
배열을 순회하며 map에 데이터를 넣으면 됩니다.
그러면 예제와 같이 데이터가 저장이 될 것입니다.
그리고 조건 연산을 사용하면 문제를 쉽게 풀 수 있습니다.
function solution(nums) {
const map = new Map();
nums.forEach((i) => map.set(i, map.get(i) ?? 0)+1);
return map.size <= nums.length/2 ? map.size : nums.length/2;
}