Codecata ⎜ 많이 포함된 숫자 뽑아내기

많이 포함된 숫자 뽑아내기

문제

nums는 숫자로 이루어진 배열입니다.

가장 자주 등장한 숫자를 k 개수만큼 return해주세요.

nums = [1,1,1,2,2,3], k = 2

return [1,2]

nums = [1] k = 1

return [1]



나의 풀이

접근방법

def top_k(nums, k):
    my_dic = {}
    my_list = []
    for num in nums:
        if num not in my_dic:
            my_dic[num] = 1
        else:
            my_dic[num] += 1
    reverse_my_dic = sorted(my_dic.items(), reverse=True, key=lambda x: x[1])
    reverse_my_dic = reverse_my_dic[:k]
    
    for num in reverse_my_dic:
    
        my_list.append(num[0])
    return my_list


nums = [3, 3, 3, 2, 2, 2, 7, 1, 8, 9]
k = 3

print(top_k(nums, k))




위코드 풀이

def top_k(nums, k):
    count = {}
    for n in nums:
        count[n] = count.get(n, 0) + 1
    bucket = [[] for _ in range(len(nums) + 1)]
    for n, freq in count.items():
        bucket[freq].append(n)
    ret = []
    for n_list in bucket[::-1]:
        if n_list:
            ret.extend(n_list)
            if len(ret) == k:
                return ret

nums = [1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 5, 6]
k = 3

print(top_k(nums, k))



위코드 풀이 코드 분석

코드1

def top_k(nums, k):
    count = {}
    for n in nums:
        count[n] = count.get(n, 0) + 1
        print(count)

출력결과

{3: 1}
{3: 1, 2: 1}
{3: 1, 2: 1, 1: 1}
{3: 1, 2: 1, 1: 2}
{3: 1, 2: 1, 1: 3}
{3: 1, 2: 2, 1: 3}
{3: 1, 2: 3, 1: 3}
{3: 2, 2: 3, 1: 3}
{3: 3, 2: 3, 1: 3}
{3: 4, 2: 3, 1: 3}
{3: 5, 2: 3, 1: 3}
{3: 5, 2: 3, 1: 3, 4: 1}
{3: 5, 2: 3, 1: 3, 4: 1, 5: 1}
{3: 5, 2: 3, 1: 3, 4: 1, 5: 1, 6: 1}


코드2

   bucket = [[] for _ in range(len(nums) + 1)]

출력결과

[[], [], [], [], [], [], [], [], [], [], [], [], [], [], []]


코드3

    for n, freq in count.items():
        bucket[freq].append(n)
    print(bucket)

출력결과

[[], [4, 5, 6], [], [2, 1], [], [3], [], [], [], [], [], [], [], [], []]


코드4

    ret = []
    for n_list in bucket[::-1]:
        if n_list:
            ret.extend(n_list)
            print(ret)

출력결과

[3]
[3, 1]
[3, 1, 2]
[3, 1, 2, 4, 5, 6]
None

댓글남기기