본문 바로가기
알고리즘/프로그래머스

프로그래머스 Lv2 귤 고르기(python)

by 개발하는 호랑이 2024. 2. 6.

귤 고르기

풀이

귤이 많은 개수를 구하면 쉽게 풀릴 것이라 생각해서, 아래처럼 풀이를 해봤다.
딕셔너리 대신 리스트를 이용해서 풀어보았고, 제출했을 때, 꽤나 시간이 오래 걸려서 실패하나 싶었지만, 아슬하게 통과를 했다.

# 귤을 수확
# 'k'개를 골라 상자 하나에 담아 판매, 귤을 크기별로 분류, 서로 다른 종류의 수를 최소화
# [1, 3, 2, 5, 4, 5, 2, 3] 8개 중 6개의 귤이면, 1, 4 를 제외하면 2,3,5롷 서로 다른 종류가 최소
# {1:1, 2:2, 3: 2, 4: 1, 5:2}이니까
# 서로 다른 종류의 수의 최솟값을 return
def solution(k, tangerine):
    numbers = [[i+1 , 0] for i in range(max(tangerine))]
    for tan in tangerine:
        numbers[tan-1][1] += 1
    numbers = sorted(numbers, key = lambda x:x[1], reverse = True)
    
    man_value = 0
    for i in range(len(numbers)):
        man_value += numbers[i][1]
        if man_value >= k:
            return i+1

다른 사람 풀이

collection.Counter를 이용해서 각 크기마다의 개수를 구했다.
그리고, for 문을 돌면서, cnt.values()로 정렬을 하되, 내림차순으로 정렬을 하고, 이 정렬로 나온 value리스트의 첫 값부터 마지막 값까지 순회를 한다.
k -= v를 통해 k의 개수가 0보다 작아졌을 때, 최소 크기 종류를 반환시키도록 하였다.

내가 푼 방식과 다르게 속도가 아주 랐다. 이런 collections.Counter를 이용하는 방법도 알아둬야겠다.

import collections
def solution(k, tangerine):
    answer = 0
    cnt = collections.Counter(tangerine)

    for v in sorted(cnt.values(), reverse = True):
        k -= v
        answer += 1
        if k <= 0:
            break
    return answer