티끌모아 태산

⭐귤 고르기 본문

프로그래머스/Level 2

⭐귤 고르기

goldpig 2024. 5. 21. 11:46
728x90

문제 설명

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

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

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

 

❗제한사항

  • 1 ≤ k  tangerine의 길이 ≤ 100,000
  • 1 ≤ tangerine의 원소 ≤ 10,000,000

핵심 아이디어

중복이 가장 많은 원소대로 정렬을 진행하고 해당 원소의 수 만큼 k에서 빼준다. 그리고 k <= 0 이되면 반복을 멈춰서 최소 개수를 출력하면 된다. 

각 원소마다 몇 개인지 확인하는 라이브러리 Counter() 활용하면 편하다. 

  1. 귤 개수를 추가할 딕셔너리 만들고 value 추가하기, Counter() 사용
  2. 귤 개수 더해가며 k개 맞추기, 빼가면서 맞추기

*개수를 찾을 때, 더하는 방식보다는 빼는 방식이 간단한 경우가 있다. 

코드 구현

from collections import Counter
def solution(k, tangerine):

    
    arr = Counter(tangerine)
    # print(arr) Counter({3: 2, 2: 2, 5: 2, 1: 1, 4: 1})
    # 정렬하기
    arr = sorted(arr.items(), key=lambda x: x[1], reverse=True)
    # print(arr) [(3, 2), (2, 2), (5, 2), (1, 1), (4, 1)]
    
    # 정렬된 딕셔너리로 귤 개수 맞추기
    answer = 0
    for i in arr:
        k -= i[1] # 귤의 개수를 뺀다.
        answer += 1
        if k <= 0:
            break
    return answer
728x90

'프로그래머스 > Level 2' 카테고리의 다른 글

괄호 회전하기  (0) 2024.05.21
점프와 순간 이동  (0) 2024.05.20
영어 끝말잇기  (0) 2024.05.20