문제

문제

programmers.co.kr/learn/courses/30/lessons/1845

 

코딩테스트 연습 - 폰켓몬

당신은 폰켓몬을 잡기 위한 오랜 여행 끝에, 홍 박사님의 연구실에 도착했습니다. 홍 박사님은 당신에게 자신의 연구실에 있는 총 N 마리의 폰켓몬 중에서 N/2마리를 가져가도 좋다고 했습니다.

programmers.co.kr

 

처음 작성한 코드

def solution(nums):
    leng = len(nums)//2
    nums = set(nums)
    if len(nums)<leng:
        return len(nums)
    return leng

 

코드 리뷰 후

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

 

깨달은 점

  • 처음에는 combinations를 사용하여 모든 조합을 만들어놓고 set(len())을 이용하여 길이가 제일 긴 조합의 길이를 반환하려고 했는데 시간 초과가 났다. 그래서 다시 생각해보니까 먼저 set()을 걸어놓으면 될 것 같았다. set을 해놓고 leng만큼 combinations을 했는데 컴파일 에러가 났다. 이유를 생각해보니 만약 nums = [1,1,1,1] 이면 set(nums) -> {1} 이게 되고 leng == 2이기 때문에 에러가 나는 것이었다. 그러면 처음에 set(nums)와 leng을 비교하여 위와 같은 경우라면(set()이 더 작으면) set(nums)의 길이를 반환하고, 아니면 combinations을 또 해서 그 중 길이가 제일 긴 조합의 길이를 반환하려고 했는데 생각해보니 저 위의 조건에서 안 걸리면 어찌됐든 len(nums)//2 만큼 뽑히는 거기 때문에 그냥 len(nums)//2를 반환하게 작성했다.