📌 파이썬 으로 풀이
📌 문제 링크 :
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
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
📌 입출력 예

추측)
크기 숫자를 인덱스로 사용하여 개수를 배열로 정리.
가장 max 값인거 부터 k값에서 빼고 0으로 초기화해서 그 다음 큰값 이런 식으로 최대한 한 종류에서 많은 수를 뺄 수 있게 하는 방식으로 진행하면 될 듯!
소스코드)
* 1차) 82.4 점 나머지 시간초과
def solution(k, tangerine):
answer = 0
tangerine_arr = [0] * (max(tangerine) + 1)
for one in tangerine :
tangerine_arr[one] += 1
while k > 0 :
max_num = max(tangerine_arr)
k -= max_num
answer += 1
tangerine_arr[tangerine_arr.index(max_num)] = 0
return answer
* 2차) 성공
def solution(k, tangerine):
answer = 0
tangerine_arr = [0] * (max(tangerine) + 1)
for one in tangerine :
tangerine_arr[one] += 1
if k < max(tangerine_arr) :
return 1
tangerine_arr.sort()
tangerine_arr.reverse()
for one in tangerine_arr :
k -= one
answer += 1
if k <= 0 :
break
return answer
리뷰)
1차 피드백)
1차에서 while문에서 시간초과가 나는 거 같아서 어떻게 수정할까 고민했는데,
이게 종류의 개수가 중요한거지 크기 종류가 무엇인가는 중요하지 않은 문제여서 이부분을 다시 생각해봤다.
크기별로 배열 정리한 후에 정렬하고 역정렬해 for문으로 가장 큰 개수를 가진 거 부터 k에서 빼면 되겠다 싶어 진행!
'Coding Test > Algorithm' 카테고리의 다른 글
| Programmers] 공원 산책 (0) | 2023.04.03 |
|---|---|
| Programmers] 덧칠하기 (0) | 2023.03.28 |
| 순열 (0) | 2023.03.18 |
| Programmers] 멀리 뛰기 (0) | 2023.03.18 |
| Programmers] [1차] 캐시 (0) | 2023.03.18 |















