티스토리 뷰
반응형
프로그래머스 귤 고르기 python
문제
문제
경화는 과수원에서 귤을 수확했습니다. 경화는 수확한 귤 중 'k'개를 골라 상자 하나에 담아 판매하려고 합니다. 그런데 수확한 귤의 크기가 일정하지 않아 보기에 좋지 않다고 생각한 경화는 귤을 크기별로 분류했을 때 서로 다른 종류의 수를 최소화하고 싶습니다.
예를 들어, 경화가 수확한 귤 8개의 크기가 [1, 3, 2, 5, 4, 5, 2, 3] 이라고 합시다. 경화가 귤 6개를 판매하고 싶다면, 크기가 1, 4인 귤을 제외한 여섯 개의 귤을 상자에 담으면, 귤의 크기의 종류가 2, 3, 5로 총 3가지가 되며 이때가 서로 다른 종류가 최소일 때입니다.
경화가 한 상자에 담으려는 귤의 개수 k와 귤의 크기를 담은 배열 tangerine이 매개변수로 주어집니다. 경화가 귤 k개를 고를 때 크기가 서로 다른 종류의 수의 최솟값을 return 하도록 solution 함수를 작성해주세요.
테스트케이스
문제 작동원리
크기별로 귤을 분류한 후, 많이 나온 크기 순으로 정렬하여 가장 적은 종류의 수로 k개를 채우는 방식입니다.
아이디어
- 귤의 크기별 빈도를 딕셔너리로 저장합니다.
- 빈도값을 기준으로 내림차순 정렬하여 가장 많이 나온 크기부터 k개를 채워갑니다.
- 이때 누적한 개수가 k 이상이 되면 그때까지 사용한 종류 수를 리턴합니다.
- 탐욕적 방법(greedy)을 사용하여 최소 종류 수를 빠르게 찾습니다.
전체코드
def solution(k, tangerine):
answer = 0
ans=dict()
for i in tangerine:
if not i in ans:
ans[i]=1
else:
ans[i]+=1
lst=[]
for key,val in ans.items():
lst.append([key,val])
lst.sort(key=lambda x:x[1],reverse=True)
N=len(lst)
for i in range(N):
if k-lst[i][1]<=0:
answer=i+1
break
else:
k-=lst[i][1]
return answer
결론
- 가장 많이 수확된 크기의 귤부터 차례로 선택하여 k개를 채울 때까지 반복합니다.
- 누적 개수가 k에 도달한 순간의 종류 수가 최소 종류 수가 됩니다.
- 시간복잡도는 \( O(n \log n) \)이며, n은 고유 크기 수입니다.
- 탐욕적 전략이 최적해를 보장하는 문제입니다.
- 실제 테스트에서도 충분히 효율적으로 동작합니다.
반응형
'백준 스터디 > 프로그래머스' 카테고리의 다른 글
"프로그래머스 '시소 짝꿍' python (0) | 2025.09.21 |
---|---|
프로그래머스 디펜스 게임 python (1) | 2025.09.19 |
프로그래머스 숫자 변환하기 Python (0) | 2025.09.15 |
프로그래머스 뒤에 있는 큰 수 찾기 python (0) | 2025.09.15 |
프로그래머스 요격 시스템 Python (0) | 2025.09.14 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 그래프 탐색
- 프로그래밍
- C++
- 브루트포스
- Python
- 문제 풀이
- python 알고리즘
- 알고리즘기초
- 문제풀이
- 동적계획법
- dfs
- 동적 계획법
- 알고리즘 문제풀이
- 백준
- 알고리즘
- 파이썬
- 인접 행렬
- 파이썬코딩
- c언어
- c++알고리즘
- 코딩
- 그리디
- DP
- 문자열처리
- C++ 알고리즘
- 알고리즘문제풀이
- 코딩 테스트
- 객체지향
- 코딩테스트
- 그리디알고리즘
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
글 보관함
반응형