목차
자기 분열수
자기 분열수란 배열의 원소 중 자기 자신의 숫자만큼 빈도수를 갖는 숫자를 의미합니다. 만약 배열이 [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 내장함수를 사용해서 코드를 한줄 더 줄였다.
'코딩테스트[파이썬] > 입문자를 위한 코딩테스트 핵심' 카테고리의 다른 글
[해시] - 팰린드롬의 길이 (0) | 2024.01.22 |
---|---|
[해시] -팰린드롬 확인 (0) | 2024.01.22 |
[해시] -빈도수2 [Counter] (0) | 2024.01.22 |
[해시] -빈수도1 (0) | 2024.01.22 |
해시 자료구조 (0) | 2024.01.22 |