[파이썬 코딩테스트] 폰켓몬

ch.2·2024년 9월 3일
0

코딩 테스트

목록 보기
21/21
post-thumbnail

문제

프로그래머스 Lv.1 폰켓몬

당신은 폰켓몬을 잡기 위한 오랜 여행 끝에, 홍 박사님의 연구실에 도착했습니다. 홍 박사님은 당신에게 자신의 연구실에 있는 총 N 마리의 폰켓몬 중에서 N/2마리를 가져가도 좋다고 했습니다.
.
중략
.
당신은 최대한 다양한 종류의 폰켓몬을 가지길 원하기 때문에, 최대한 많은 종류의 폰켓몬을 포함해서 N/2마리를 선택하려 합니다. N마리 폰켓몬의 종류 번호가 담긴 배열 nums가 매개변수로 주어질 때, N/2마리의 폰켓몬을 선택하는 방법 중, 가장 많은 종류의 폰켓몬을 선택하는 방법을 찾아, 그때의 폰켓몬 종류 번호의 개수를 return 하도록 solution 함수를 완성해주세요.


접근 방법

  • 숫자 배열이 주어질 때 가장 다양한 숫자의 가짓수를 return
  • return할 수 있는 숫자의 최대 가짓수는 num//2
  • 폰켓몬 종류 번호의 개수를 return 하는 것!

나의 답안

def solution(nums):
    # nums/2
    # 숫자 배열이 주어질 때 가장 많은 숫자의 가짓수
    nums_list= []
    
    for inedex, num in enumerate(nums):
        if num not in nums_list:
            nums_list.append(num)
            
    answer= min(len(nums)//2, len(nums_list))
    
    return answer
  • enumerate와 nums_list를 사용해 서로 다른 폰켓몬만 nums_list에 담는다.
  • 이후 가져갈 수 있는 폰켓몬의 최대 가짓수인 nums/2 의 길이와 nums_list의 길이를 비교해서, 작은 값을 return한다.
    → 서로 다른 폰켓몬의 수가 nums/2 보다 많아도 가져갈 수 있는 건 nums/2 만큼의 폰켓몬.
    → 서로 다른 폰켓몬 수가 nums/2 보다 적으면 가져가는 건 서로 다른 폰켓몬들.

다른 답안 - 딕셔너리 사용

def solution(nums):
    nums_dict= {}
    for i in nums:
        if i not in nums_dict:
            nums_dict[i]= True
    answer= min(len(nums)//2, len(nums_dict))
    return answer
  • 딕셔너리를 사용해 key값은 nums의 요소를 할당, value값으로는 True를 할당하여 간단하게 처리한다.

다른 답안 - 집합 사용

def solution(nums):
    distinct_num = set()

    for num in nums:
        distinct_num.add(num) # 집합 - add

    answer = min(len(nums)//2, len(distinct_num))
    
    return answer
  • 집합을 사용해 간단하게 중복된 값을 제거한다.
  • 집합에 요소를 추가할 때는 add( )를 사용한다.

초간단 답안 - 집합 사용

def solution(nums):
    answer = min(len(nums)//2, len(set(nums)))
    return answer
  • for문을 사용하지 않아도 중복이 제거되니까, 바로 개수를 비교해 return한다.
profile
데이터 분석 공부중

0개의 댓글