def solution(nums):
answer = 0
if len(set(nums)) >= len(nums) // 2:
answer = len(nums) // 2
else:
answer = len(set(nums))
return answer
문제를 처음 봤을 때 아무리 봐도 반복문을 돌리면 시간 초과가 날 것이 보였다. 그렇기 때문에 공통점을 찾기 시작했고 문제에서 절반만 가져라는 지문을 보고 대강 길이를 통해서 값을 만들어 내야함을 눈치챌 수 있었다.
가장 먼저 생각한 것은 집합이었고 set 처리한 리스트의 길이가 기존의 주어진 리스트의 길이보다 크거나 같으면 주어진 리스트의 절반이 공통된 걸 찾았다. 그리고 예외인 경우가 작을 경우였는데 이에 대해서는 처음에 len(nums) // 2 - 1로 했었다.
그러니 에러가 났고 뭐가 문제인지 다시 접근해 [1, 1, 1, 1, 2, 2, 2, 2] 의 경우를 생각해봤다. 그 결과, 나는 이 부분에서는 경우의 수를 따지고 있었다. 어차피 최대로 가져갈 수 있는 종류는 1과 2 두 개 뿐인데 [1, 1, 1, 2], ... 이런 식으로 생각하고 있었더라. 그래서 집합처리한 걸 리턴해주는 것으로 변경하니 해결했다.
def solution(ls):
return min(len(ls)/2, len(set(ls)))