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

[해시] -빈수도1

softmoca__ 2024. 1. 22. 13:51
목차

빈도수(ver 1)

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

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

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

 

나의코드

from collections import defaultdict
def solution(nums):
    answer = -1
    MM=0
    dic=defaultdict()
    for x in nums:
        if x in dic:
            dic[x]=2
        else:
            dic[x]=1
    for key in dic:
        if dic[key]==1:
            if MM< key:
                MM=key


       
    return -1 if MM==0 else MM
                            
                
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([23, 56, 11, 67, 120, 560, 812, 960, 560, 777, 888, 960]))
print(solution([11, 73, 156, 789, 345, 156, 789, 345, 678, 555, 678]))
print(solution([1, 3, 1, 5, 7, 2, 3, 1, 5]))

nums을 순회하며 해당 원소가 dic에 있으면 2로 체크를 없으면 1로 체크한뒤 새로운 키와 값을 생선하였다.

 

 

정답코드

def solution(nums):
    answer = -1
    cnt = [0] * 1001
    for x in nums:
        cnt[x] += 1

    for i in range(1000, 0, -1):
        if cnt[i] == 1:
            return i
       
    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([23, 56, 11, 67, 120, 560, 812, 960, 560, 777, 888, 960]))
print(solution([11, 73, 156, 789, 345, 156, 789, 345, 678, 555, 678]))
print(solution([1, 3, 1, 5, 7, 2, 3, 1, 5]))

 

나와 다른 로직으로 작성이 되어있다.

배열의 인덱스를 활용하여 로직을 구성했으며 가장 큰 숫자를 위해 nums 원소의 최대값인 1000부터 순회하여 값이 1인 원소를 찾는 로직이다.

시간복잡도는 거진 비슷하진 한것 같지만 정답 코드가 코드적으로 더 깔끔하고 양이 적어 좋은것 같다.