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

[해시] -자기분열수

softmoca__ 2024. 1. 22. 14:27
목차

자기 분열수

자기 분열수란 배열의 원소 중 자기 자신의 숫자만큼 빈도수를 갖는 숫자를 의미합니다. 만약 배열이 [1, 2, 3, 1, 3, 3, 2, 4] 라면
1의 빈도수는 2,
2의 빈도수는 2,

3의 빈도수는 3,
4의 빈도수는 1입니다.
여기서 자기 자신의 숫자와 같은 빈도수를 갖는 자기 분열수는 2와 3입니다.
매개변수 nums에 자연수가 원소인 배열이 주어지면 이 배열에서 자기 분열수 중 가장 작은 수를 찾아 반환하는 프로그램을 작성하세요.

자기 분열수가 존재하지 않으면 -1를 반환하세 요.

 

 

제한사항:
• nums의 길이 3 <= n <= 500,000
• 배열 nums의 원소는 자연수입니다. 1 <= nums[i] <= 1,000,000

 

나의코드

from collections import Counter
def solution(nums):
    answer = 10000
    CC=Counter(nums)
    
    for x in CC:
        if CC[x]==x:
            if answer > x:
                answer=x
    return -1 if answer ==10000 else answer



                          
print(solution([1, 2, 3, 1, 3, 3, 2, 4]))
print(solution([1, 2, 3, 3, 3, 2, 4, 5, 5, 5]))
print(solution([1, 1, 2, 5, 5, 5, 5, 5, 3, 3, 3, 3, 5]))
print(solution([7, 6, 7, 7, 8, 8, 8, 8, 7, 5, 7, 7, 7, 8, 8]))
print(solution([11, 12, 5, 5, 3, 11, 7, 12, 15, 12, 12, 11, 12, 12, 7, 8, 12, 11, 12, 7, 12, 5, 15, 20, 15, 12, 15, 12, 15, 14, 12]))

이전 문제와 같은 로직으로 Counter 라이브러리를 사용해서 해당 키와 값을 비교해서 최소값을 저장.

 

 

정답코드

from collections import Counter
def solution(nums):
    answer = 1000000000
    nH = Counter(nums)
    for key in nH:
        if nH[key] == key:
            answer = min(answer, key)

    return -1 if answer == 1000000000 else answer 
                          
print(solution([1, 2, 3, 1, 3, 3, 2, 4]))
print(solution([1, 2, 3, 3, 3, 2, 4, 5, 5, 5]))
print(solution([1, 1, 2, 5, 5, 5, 5, 5, 3, 3, 3, 3, 5]))
print(solution([7, 6, 7, 7, 8, 8, 8, 8, 7, 5, 7, 7, 7, 8, 8]))
print(solution([11, 12, 5, 5, 3, 11, 7, 12, 15, 12, 12, 11, 12, 12, 7, 8, 12, 11, 12, 7, 12, 5, 15, 20, 15, 12, 15, 12, 15, 14, 12]))

로직은 나의 코드와 비슷하나 min 내장함수를 사용해서 코드를 한줄 더 줄였다.