파이썬 알고리즘 문제 풀이

[프로그래머스] Lv2. 귤 고르기 파이썬

gogi masidda 2024. 2. 3. 21:11
  • 귤 고르기
문제 설명

경화는 과수원에서 귤을 수확했습니다. 경화는 수확한 귤 중 'k'개를 골라 상자 하나에 담아 판매하려고 합니다. 그런데 수확한 귤의 크기가 일정하지 않아 보기에 좋지 않다고 생각한 경화는 귤을 크기별로 분류했을 때 서로 다른 종류의 수를 최소화하고 싶습니다.

예를 들어, 경화가 수확한 귤 8개의 크기가 [1, 3, 2, 5, 4, 5, 2, 3] 이라고 합시다. 경화가 귤 6개를 판매하고 싶다면, 크기가 1, 4인 귤을 제외한 여섯 개의 귤을 상자에 담으면, 귤의 크기의 종류가 2, 3, 5로 총 3가지가 되며 이때가 서로 다른 종류가 최소일 때입니다.

경화가 한 상자에 담으려는 귤의 개수 k와 귤의 크기를 담은 배열 tangerine이 매개변수로 주어집니다. 경화가 귤 k개를 고를 때 크기가 서로 다른 종류의 수의 최솟값을 return 하도록 solution 함수를 작성해주세요.

 

맞았지만 시간 복잡도가 큰 것

def solution(k, tangerine):
    answer = 0
    counts = {}
    for i in range(len(tangerine)):
        if tangerine[i] not in counts:
            counts[tangerine[i]] = tangerine.count(tangerine[i])
    counts = sorted(counts.items(), key=lambda x:x[1], reverse=True)
    
    for c in counts:
        if k > 0:
            k -= c[1]
            answer += 1
    return answer

count()가 반복문이 돌아가는 것이라 최대한 복잡도를 줄이고자 it문을 사용했지만 그래도 시간 초과가 발생했다.

 

정답 풀이

def solution(k, tangerine):
    answer = 0
    counts = {}
    for size in tangerine:
        counts[size] = counts.get(size, 0) + 1
    counts = sorted(counts.items(), key=lambda x:x[1], reverse=True)
    
    for c in counts:
        if k > 0:
            k -= c[1]
            answer += 1
    return answer

get(key, [default])는 딕셔너리에 키가 있으면 그것을 사용하고 없으면 default를 사용하는 것이다. get으로 count()로 인한 복잡도를 줄일 수 있다.

 

다른 사람 풀이

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

collections.Counter()는 중복된 데이터가 있는 배열을 파라미터로 넘기면, 그 배열의 원소가 나오는 횟수를 세서 딕셔너리로 반환한다.

728x90