프로그래머스의 폰켓몬 문제를 풀어보았다. 해시 문제를 하나 풀려고 했는데 이름이 재밌어서 들어가보니 이미 풀었던 문제였다. 기억이 하나도 없는걸?
여러 방법이 있겠지만 Set이 생각났다. new Set(...)을 통해서 반복을 제거하자. Set object는 Map object와 비슷하면서 조금 다른데, value만을 값으로 가진다는 부분에서 다르다. 그렇다고 key값이 없는 것은 아닌데, value가 key값도 겸한다고 이해하면 편하다. key값이 겸한다는 것은 중복이 안된다는 말이기 때문에 같은 값을 가질 수 없다. 같은 값이 뒤에 등록이 되면 뒤에 등록된 값이 제외된다.
const setTest = new Set(["set","test","set"])
// index 2에 위치한 "set"은 제외됨
console.log(setTest) // Set(2) {'set', 'test'}
// 키 값이 존재함. value가 겸하고 있는 모습
console.log(setTest.keys()) // SetIterator {'set', 'test'}
console.log(setTest.values()) // SetIterator {'set', 'test'}
이런 Set의 특성을 이용해서 중복된 폰켓몬 친구들을 배열에서 제외시켜준다.
최대 (전체 폰켓몬/2) 갯수 만큼 선택을 하되 최대한 다양한 폰켓몬을 선택해야 하기 때문에 두 가지 경우의 수로 나눌 수 있다.
- 중복된 폰켓몬을 제외한 폰켓몬 수 > 전체 폰켓몬/2
- 중복된 폰켓몬을 제외한 폰켓몬 수 <= 전체 폰켓몬/2
다음과 같은 경우의 수를 가지고 코드를 작성해보았다.
function solution(poketmons) {
const length = Math.floor(poketmons.length / 2);
const modifiedSetLength = [...new Set(poketmons)].length;
if (length >= modifiedSetLength) return modifiedSetLength;
return length;
}