[프로그래머스](python) 폰켓몬 - 찾아라 프로그래밍 마에스터

berry ·2021년 7월 30일
0

Algorithm

목록 보기
55/77
post-thumbnail

문제


🧩 수도 코드 (시간초과)

nums에서 len(nums)/2 만큼의 수를 랜덤으로 조합하고
리스트에 저장해서 종류가 가장 많은 것 출력


🏁 내 코드 (시간초과)

def solution(nums):
    from itertools import combinations as cb
    tmp = []
    n = len(nums)//2
    nums = list(set(nums))
    if len(nums) < n: # 뽑아야하는 폰켓몬의 수가 중복되지 않는 폰켓몬의 수보다 크면
        picks = list((cb(nums, len(nums))))
    else: # 중복되지 않는 폰켓몬의 수가 뽑아야하는 수보다 더 크면
        picks = list(((nums, n)))
    [tmp.append(len(set(pick))) for pick in picks]
    return(max(tmp))


nums에서 set으로 중복 비허용했지만 테스트 케이스 7, 12, 13, 16에서 시간초과


질문하기에서 나와 똑같이 시간초과로 안되는 게시글이 있어, 문제를 다시 읽고 생각해보니 ! 어차피 나올 수 있는 종류의 최대값은 len(nums)//2 !

🧩 수도 코드 (풀이)

nums를 받고 새로 set(nums)의 변수를 만든 후
뽑아야하는 폰켓몬의 수 < 중복되지 않은 폰켓몬의 수이면
뽑아야하는 폰켓몬의 수 출력
(예제 1,2)

만약 뽑아야하는 폰켓몬의 수 > 중복되지 않은 폰켓몬의 수(n > len(nums)) 이면 중복되지 않은 폰켓몬의 수(len(nums)) 출력 (예제 3)


🏁 내 코드 (풀이)

def solution(nums):
    n = len(nums)//2
    nums = list(set(nums))
    return n if len(nums) > n else len(nums)



🧩 다른 풀이

def solution(ls):
    return min(len(ls)/2, len(set(ls)))

그렇지..어차피 둘 중 작은 것 출력하면 되니까..!


profile
Engineer

0개의 댓글