Seize the day
article thumbnail

https://school.programmers.co.kr/learn/courses/30/lessons/138476

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제 설명

경화는 과수원에서 귤을 수확했습니다. 경화는 수확한 귤 중 '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

문제 해결

from collections import Counter

def solution(k, tangerine):
    answer = 0
    dic = Counter(tangerine).most_common()
    num = 0
    for i in dic:
        tmp = num
        num += i[1]
        if num <= k:
            answer += 1
        elif tmp < k and num >= k:
            answer += 1
    return answer

 

문제 풀이 설명

서로 다른 종류의 귤의 개수를 최소화 하는것이 문제의 목표이다.

1) Counter() 함수를 사용해 tangerine 매개변수에서 각 귤의 크기와 해당 크기의 개수를 정의한다.

2) most_common() 함수로 가장 많은 개수를 가진 크기를 list 형태로 가져온다.

3) 해당 리스트를 돌면서, 개수가 k 보다 작다면 해당 크기의 귤을 모두 가져간다.

4) 리스트를 돌때 k 보다는 낮지만 해당 크기의 귤을 일부분 가져가야 할때, 결국 귤의 종류가 늘어나는 것이므로 해당 경우를 정의한다.

 

사용된 개념(Counter, most_common())

Counter 클래스는 Collections 모듈에서 import 해야 사용할 수 있다.

from collections import Counter

이때 카운터는 대문자로 시작하는 것을 까먹으면 안된다.

import 하면 Counter 클래스를 사용할 수 있는데, 중복된 데이터가 저장된 리스트를 인자로 주었을 때 각 원소가 몇 번씩 나오는지 저장된 객체를 얻을 수 있다. dictionary를 지원하기 때문에, 해당 함수 또한 모두 사용할 수 있다.

 

most_common() 함수는 데이터의 개수가 많은 순으로 정렬된 리스트를 리턴한다.

인자로 숫자 n을 입력하면 n만큼만 리턴할 수도 있다. 예로 가장 개수가 많은 데이터 한 개만 궁금할 때,

most_common(1)을 입력하면 알 수 있다.

 

profile

Seize the day

@성 현

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!