목차
빈도수(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인 원소를 찾는 로직이다.
시간복잡도는 거진 비슷하진 한것 같지만 정답 코드가 코드적으로 더 깔끔하고 양이 적어 좋은것 같다.
'코딩테스트[파이썬] > 입문자를 위한 코딩테스트 핵심' 카테고리의 다른 글
[해시] -자기분열수 (0) | 2024.01.22 |
---|---|
[해시] -빈도수2 [Counter] (0) | 2024.01.22 |
해시 자료구조 (0) | 2024.01.22 |
[배열과 연결리스트와 덱] -두수의 합- (0) | 2024.01.22 |
[배열과 연결리스트와 덱] - 중복제거- (0) | 2024.01.22 |