Algorithm

[프로그래머스] Level1 | 폰켓몬- 파이썬(Python) | 찾아라 프로그래밍 마에스터

토오오끼 2021. 11. 29. 15:58
728x90
반응형

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

 

코딩테스트 연습 - 폰켓몬

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

programmers.co.kr

 


 

굉장히 간단하게 풀 수 있는 문제인데 너무 어렵게 생각해서 시간 초과 왕창 맞았던 문제이다.

 

첫번째 시도 - 시간 초과 실패

from itertools import combinations as cb

def solution(nums):
    answer = 0
    
    result = []
    for numb in cb(nums, int(len(nums)/2)) :
        result.append(len(set(numb)))
    
    answer = max(result)

    return answer

nums의 길이는 항상 짝수이므로 2로 나눈 만큼의 조합으로 풀려고 combinations를 사용했었다.

나온 조합 중 요소들의 중복을 제거하기 위해 set을 사용했고 그 길이들을 전부 result라는 빈 리스트에 담아서 그 중 가장 큰 수를 answer로 뽑았는데 for문을 돌면서 불필요한 반복이었는지 시간이 굉장히 오래 걸렸고 

당연히 시간 초과가 왕창 떴다.

 

 

for문을 사용하지 않고 같은 로직으로 풀 수 있는 방법을 생각해봤는데 생각보다 너무 간단해서 허무했다...

두번째 시도 - 성공

def solution(nums):
    answer = 0
    
    num_len = len(set(nums))
    result = int(len(nums)/2)
    
    if result < num_len :
        answer = result
    else :
        answer = num_len
    
    return answer

최대한 많은 종류의 포켓몬을 선택하고자 하기 때문에 for문을 생각하지 않고 그냥 set으로 중복을 제거하여 종류가 겹치지 않도록 해주면 되었다.

그 후 nums의 길이를 2로 나눈 값과 set으로 중복을 제거한 nums의 길이를 비교하여 답을 구할 수 있었다.

 

 

 

가끔은 쉬운 문제임에도 어렵게 생각하는 것 보다 직관적으로 생각하는 것도 중요한 것 같다 :(


해당 문제 풀이 코드

 

728x90
반응형