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

[해시] -빈도수2 [Counter]

softmoca__ 2024. 1. 22. 13:59

빈도수(ver 2)

매개변수 nums에 길이가 n인 수열이 주어지면 수열의 원소중에서 빈도수가 1인 가장 큰 숫자 를 반환하는 프로그램을 작성하세요.

빈도수 1인 숫자가 없을 경우 -1를 반환하세요.

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

 

나의코드

from collections import defaultdict, Counter
def solution(nums):
    answer = -1
    CC=Counter(nums)
    for x in CC:
        if CC[x]==1:
            if answer<x:
                answer=x

    return answer
                            
                
print(solution([3, 9, 2, 12, 9, 12, 8, 7, 9, 12]))
print(solution([2, 1, 3, 2, 1, 3, 4, 5, 4, 5, 6, 7, 6 ,7, 8, 8]))
print(solution([2235253, 5525612, 142561567, 123456789, 2235253, 560, 123456789, 142561567]))
print(solution([11, 73, 156, 789, 345, 156, 789, 345, 678, 555, 678]))
print(solution([1, 3, 1, 5, 7, 2, 3, 1, 5]))

입력값의 최대값이 10억이니 이전 문제의 정답코드처럼 배열의 인덱스로는 풀면 안되겠다고 생각을 하였다.

그래서 해시 자료구조를 사용하려 하였고 이전 문제처럼 각각의 nums의 원소를 순회하면 원소를 키값으로 생성을 해도 되지만

간단한 Counter 라이브러리를 사용하였다.

 

정답코드

from collections import defaultdict, Counter
def solution(nums):
    answer = -1
    nH = Counter(nums)
    for key in nH:
        if nH[key] == 1:
            answer = max(answer, key)
 
    return answer
                            
                
print(solution([3, 9, 2, 12, 9, 12, 8, 7, 9, 12]))
print(solution([2, 1, 3, 2, 1, 3, 4, 5, 4, 5, 6, 7, 6 ,7, 8, 8]))
print(solution([2235253, 5525612, 142561567, 123456789, 2235253, 560, 123456789, 142561567]))
print(solution([11, 73, 156, 789, 345, 156, 789, 345, 678, 555, 678]))
print(solution([1, 3, 1, 5, 7, 2, 3, 1, 5]))

 

나의 코드와 거의 일치하나 max 내장 함수를 사용하여 더 코드가 짧다.