코딩테스트[파이썬]/입문자를 위한 코딩테스트 핵심

[정렬] -사탕

softmoca__ 2024. 1. 22. 22:19
목차

사탕 종류

현수는 사탕을 좋아합니다. 현수에게 사탕이 n개 있습니다.
현수 엄마는 현수가 요즘 너무 사탕을 많이 먹어 건강에 좋지 않다고 생각해 현수에게 가지고 있는 사탕의 절반(n/2)개만 먹으라고 했습니다. n은 항상 짝수입니다.
매개변수 nums에 현수가 가지고 있는 n개의 사탕의 종류 정보가 주어지면 현수가 n/2개의 사 탕을 먹는다면 최대 몇 종류의 사탕을 먹을 수 있는지를 반환하는 프로그램을 작성하세요.

 

 

제한사항:
• nums의 길이는 100,000을 넘지 않습니다.
• nums[i]는 i번재 사탕의 종류를 의미합니다. nums[i]값이 같으면 같은 종류의 사탕입니다. • 1 <= nums[i] <= 1,000

 

나의 코드

from collections import Counter
def solution(nums):
    answer = 0
    CC=Counter(nums)
    
    if len(CC)>=len(nums)//2:
        answer=len(nums)//2
    else:
        answer=len(CC)

    return answer
    
                       
print(solution([2, 1, 1, 3, 2, 3, 1, 2]))
print(solution([1, 3, 5, 7, 2, 3, 7, 5, 3, 2, 5, 7, 9, 12]))
print(solution([5, 5, 5, 5, 5, 5]))
print(solution([12, 23, 11, 3, 5, 23, 23, 23, 23, 23, 23, 23]))
print(solution([100, 200, 300, 400, 500, 600, 700, 800]))

이전에 배운 해시의 Counter에 너무 깊은 감명에 빠졌는지 바로 Counter를 사용하는 로직이 떠올랐다..!

뭐 우선 전체적으로 코드는 논리적으로 깔끔하게 잘 짠것같다.

 

정답 코드

def solution(nums):
    n = len(nums)
    cnt = 1
    nums.sort()
    for i in range(1, n):
        if nums[i-1] != nums[i]:
            cnt += 1
            
    return cnt if cnt < n//2 else n//2
    
                       
print(solution([2, 1, 1, 3, 2, 3, 1, 2]))
print(solution([1, 3, 5, 7, 2, 3, 7, 5, 3, 2, 5, 7, 9, 12]))
print(solution([5, 5, 5, 5, 5, 5]))
print(solution([12, 23, 11, 3, 5, 23, 23, 23, 23, 23, 23, 23]))
print(solution([100, 200, 300, 400, 500, 600, 700, 800]))

역시 정렬 파트여서 그런가 정렬을 사용한 코드이다.

정답 코드 역시 간결하고 가독성이 좋은 코드 같다.

이후 정렬 문제들은 다른 자료구조가 생각이 나도 정렬을 활용하는 코드로 짜도록 짱구를 굴려 봐야겠다.