코드
def solution(nums):
answer = len(set(nums))
if answer > len(nums)/2:
return len(nums)/2
return answer
n마리의 폰켓몬이 주어지면 n/2마리의 폰켓몬을 고르되, 가장 많은 종류의 폰켓몬을 골라야 한다.
nums = [3,1,2,3]이면, 4 / 2 = 2마리의 폰켓몬을 골라야 한다.
이때, 1번, 2번 또는 2번, 3번 또는 1번, 3번을 골라야 nums에서 2마리를 고를 수 있는 가장 많은 종류인 2종류의 폰켓몬을 고를 수 있다.
nums = [3,3,3,2,2,2]이면, 6 / 2 = 3마리의 폰켓몬을 골라야 한다.
2번 2개, 3번 1개 또는 2번 1개, 3번 2개를 골라야 nums에서 3마리를 고를 수 있는 가장 많은 종류인 2종류의 폰켓몬을 고를 수 있다.
겹치지 않게 고를 수 있는 경우를 찾기 위해 set(nums)의 길이를 answer로 저장하였다.
set은 요소가 중복되지 않으며, 순서가 없는 자료형이다.
만약 len(nums)/2보다 answer가 작으면, answer를 그대로 리턴한다.
nums = [3,3,3,2,2,2]이면 len(nums)/2 = 3이므로 3마리를 골라야 한다.
하지만 set(nums) = (2, 3)이므로 answer는 len(set(nums) = 2이다.
3마리를 골라야 하는 상황에서 중복되지 않게 고를 수 있는 폰켓몬은 2마리뿐인 셈이다.
따라서 최대 고를 수 있는 폰켓몬은 2마리이므로 answer를 리턴한다.
반대로, len(nums)/2보다 answer가 크면 len(nums)/2를 그대로 리턴한다.
nums = [3,1,2,3]이면 len(nums)/2 = 2이므로 2마리를 골라야 한다.
set(nums) = (1, 2, 3)이므로 answer = len(set(nums) = 3이다.
중복되지 않게 고를 수 있는 폰켓몬은 3마리이지만 우리는 2마리만 고르면 되는 상황이다.
따라서 answer가 len(nums)/2보다 크면 그대로 len(nums)/2를 리턴한다.
다른 사람의 코드
def solution(nums):
return min(len(set(nums)), len(nums)/2)
전체적인 논리는 위 과정과 똑같다.
조건문을 통해 누가 큰 지 판별하는 대신 두 값을 min() 함수를 통해 작은 값을 찾아 리턴할 수 있다.