꼬꼬마 블로그

꼬꼬마의 기술 블로그

문제 설명

프로그래머스 레벨 2의 문제로 찾아라 프로그래밍 마에스터에 출제된 문제입니다. 조금만 생각해보면 굉장히 쉽게 풀 수 있는 문제입니다. 거의 보자마자 풀었기 때문에 레벨 1 수준이라고 생각합니다.

 

문제 자체는 굉장히 긴데 요약하면 중복을 허용한 폰켓몬이 있을 때 ( 전체 폰켓몬 개수 / 2 ) 한 폰켓몬을 뽑으려고 합니다. 이때 가장 다양하게 폰켓몬을 뽑았을 때 뽑은 폰켓몬의 종류의 개수를 묻는 문제입니다.

 

제한 사항과 입출력 예제입니다. 다른 것 보다 제한사항 4번을 보시면 폰켓몬을 선택하는 방법이 아닌 최대 종류만 반환하면 되는 문제라 난이도가 많이 떨어집니다.

 

풀이

def solution(nums):
    cnt = len(nums) // 2

    monster = list(set(nums))
    if len(monster) < cnt:
        return len(monster)

    return cnt

 

변수 설명

cnt: 뽑아야 할 폰켓몬의 개수

monster: 폰켓몬의 종류 (전체 폰켓몬에서 중복을 제거한 배열)

 

간단 설명

set을 통해 중복을 제거하면 엄청 쉽게 풀리는 문제입니다. 모든 폰켓몬에서 중복을 제거하면 폰켓몬의 종류가 배열에 담깁니다.

여기서 두 가지 경우로 나누어 볼 수 있습니다.

 

- 내가 뽑아야 할 폰켓몬의 수가 전체 종류의 수보다 작거나 같은 경우: 가장 다양하게 뽑을 경우 뽑을 때마다 다른 종을 뽑습니다. 고로 가장 다양하게 뽑는다면 내가 뽑아야 할 폰켓몬의 수만큼 종류를 뽑습니다.

 

- 내가 뽑아야 할 폰켓몬의 수가 전체 종류의 수보다 클 경우: 가장 다양하게 뽑는다고 하면 종류만큼 하나씩 뽑고 같은 종을 추가로 더 뽑을 수 있습니다. 이때 추가로 뽑는다면 뽑은 종류에는 영향이 가지 않기 때문에 전체 종류만큼 뽑을 수 있습니다.

 

다른 분들도 저와 같은 논리로 푸신 것으로 보아 가장 쉬운 방법인 것 같습니다.