https://school.programmers.co.kr/learn/courses/30/lessons/1845
약 9분
해시 카테고리에 있는 문제였지만, 처음에 문제를 읽었을때 떠오른 생각은 …
“어? set 자료구조로 중복을 제거하면 되지 않을까?” 였다.
그래서 입력으로 들어오는 nums 리스트를 set 자료구조로 변환해주어 폰켓몬 종류의 중복을 제거했다.
그 후에는 입출력을 비교하며 조건을 정리했다.
만약 선택할 수 있는 폰켓몬의 종류 개수(set 자료구조의 길이)가 n/2(선택해야하는 폰켓몬 수) 보다 크다면,
n/2개가 가장 많은 종류의 폰켓몬을 선택하는 방법일 것이다.
반대로 선택할 수 있는 폰켓몬의 종류 개수(set 자료구조의 길이)보다 n/2(선택해야하는 폰켓몬 수) 가 크다면,
선택할수 있는 폰켓몬 종류를 다 사용해야 n/2개를 선택할 수 있기 때문에 …
폰켓몬의 종류 개수(set 자료구조의 길이) 만큼이 가장 많은 종류의 폰켓몬을 선택하는 방법이 된다.
위의 문장을 수도코드로 간단히 정리해보면,
nums 리스트를 set 자료구조로 변환
if set의 길이 > N/2 이면:
return n/2
if set의 길이 <= N/2:
return set의 길이
def solution(nums):
nums_set = set(nums)
if len(nums_set) > len(nums) / 2:
return len(nums) / 2
else:
return len(nums_set)
min 함수로 if 조건문을 한줄로 줄일 수 있을 것 같다.
def solution(nums):
return min(len(set(nums), len(nums) / 2)
해시 카테고리니까 딕셔너리 사용해서도 풀어봤다.
def solution(nums):
nums_map = {}
for num in nums:
if not num in nums_map:
nums_map[num] = True
return min(len(nums_map), len(nums) / 2)
딕셔너리를 만들어서 폰켓몬의 종류를 파악하고, 정답을 리턴하는 부분은 위의 코드와 같게 작성해줬다.