몸과 마음이 건전한 SW 개발자

코드트리 | HashMap / 자주 등장한 top k 숫자 {언어 : Python} 본문

알고리즘

코드트리 | HashMap / 자주 등장한 top k 숫자 {언어 : Python}

스위태니 2025. 1. 15. 17:49

문제 링크

https://www.codetree.ai/trails/complete/curated-cards/challenge-top-k-frequent-elements/description

 

Code Tree | Learning to Code with Confidence

A super-comprehensive, meticulously arranged Coding Learning Curriculum engineered by Algorithm Experts composed of former International Olympiad in Informatics (IOI) medalists.

www.codetree.ai

정답 코드

n, k = map(int, input().split())
arr = list(map(int, input().split()))

# Write your code here!
stack = []
dictArr = dict()
for num in arr:
    if dictArr.get(num, 0):
        dictArr[num] += 1
    else:
        dictArr[num] = 1
itemsArr = sorted(list(dictArr.items()), key=lambda x:(x[1], x[0]), reverse=True)
for i in range(k):
    iak, iav = itemsArr[i]
    print(iak, end=" ")

다른 사람 풀이

n, k =map(int, input().split())
arr = list(map(int, input().split()))
freq = dict()

for num in arr:
    if num in freq:
        freq[num]+=1
        
    else:
        freq[num]=1

topk=dict()

keys = []
for key, value in freq.items():
    if value in topk:
        topk[value].append(key)
    else:
        topk[value] = [key]
        keys.append(value)

keys = sorted(keys, reverse=True)

for key, value in topk.items():
    topk[key] = sorted(topk[key],reverse=True)

for num in keys:
    if k<=0:
        break
    for answer in topk[num]:
        if k<=0:
            break

        print(answer, end=" ")
        k-=1

풀이 방법

  1. 입력 받기:
    • n, k는 숫자의 개수와 출력할 숫자의 개수.
    • arr는 숫자가 담긴 배열.
  2. 빈도 계산:
    • freq 딕셔너리를 만들어 배열 arr의 각 숫자가 몇 번 등장했는지 저장한다.
    • 딕셔너리의 key는 숫자, value는 등장 횟수.
  3. 빈도를 기준으로 그룹화:
    • topk 딕셔너리를 만들어, 등장 횟수를 기준으로 숫자를 그룹화한다.
    • 딕셔너리의 key는 등장 횟수, value는 해당 등장 횟수를 가진 숫자의 리스트.
  4. 정렬:
    • 등장 횟수를 나타내는 key 값들을 keys 리스트에 모아, 내림차순으로 정렬한다.
    • 각 등장 횟수에 속하는 숫자 리스트들도 내림차순으로 정렬한다.
  5. 출력:
    • 등장 횟수가 높은 숫자부터 k개를 차례대로 출력한다.
    • k가 0이 되면 반복을 멈춘다.

느낀점

  • 속도가 283ms 와 96ms로 차이가 날 정도로 아래 코드가 더 효율적이다.
  • lambda 오랜만에 써서 어떻게 쓰나 했다.
  • sorted에 정렬을 하기 위해 key=을 사용해야 한다.
  • 다 까먹었다...