[프로그래머스] Lv1. 폰켓몬(Python)

zzzzsb·2024년 10월 7일
0

프로그래머스

목록 보기
28/33

문제 링크

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 함수 사용

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)

딕셔너리를 만들어서 폰켓몬의 종류를 파악하고, 정답을 리턴하는 부분은 위의 코드와 같게 작성해줬다.

profile
성장하는 developer

0개의 댓글