문제 설명
프로그래머스 레벨 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을 통해 중복을 제거하면 엄청 쉽게 풀리는 문제입니다. 모든 폰켓몬에서 중복을 제거하면 폰켓몬의 종류가 배열에 담깁니다.
여기서 두 가지 경우로 나누어 볼 수 있습니다.
- 내가 뽑아야 할 폰켓몬의 수가 전체 종류의 수보다 작거나 같은 경우: 가장 다양하게 뽑을 경우 뽑을 때마다 다른 종을 뽑습니다. 고로 가장 다양하게 뽑는다면 내가 뽑아야 할 폰켓몬의 수만큼 종류를 뽑습니다.
- 내가 뽑아야 할 폰켓몬의 수가 전체 종류의 수보다 클 경우: 가장 다양하게 뽑는다고 하면 종류만큼 하나씩 뽑고 같은 종을 추가로 더 뽑을 수 있습니다. 이때 추가로 뽑는다면 뽑은 종류에는 영향이 가지 않기 때문에 전체 종류만큼 뽑을 수 있습니다.
다른 분들도 저와 같은 논리로 푸신 것으로 보아 가장 쉬운 방법인 것 같습니다.
'개발 > 알고리즘 문제 풀이' 카테고리의 다른 글
[프로그래머스] 삼각 달팽이 (0) | 2021.01.29 |
---|---|
[프로그래머스] 숫자의 표현 (0) | 2021.01.28 |
[프로그래머스] 튜플 (0) | 2021.01.27 |
[프로그래머스] 전화번호 목록 (0) | 2021.01.27 |
[프로그래머스] 예상 대진표 (0) | 2021.01.27 |