[프로그래머스 스쿨][Python] 귤 고르기
2023. 1. 30. 01:55ㆍ알고리즘 문제풀이
반응형
문제
문제 설명
경화는 과수원에서 귤을 수확했습니다. 경화는 수확한 귤 중 '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 | tangerine | result |
6 | [1, 3, 2, 5, 4, 5, 2, 3] | 3 |
4 | [1, 3, 2, 5, 4, 5, 2, 3] | 2 |
2 | [1, 1, 1, 1, 2, 2, 2, 3] | 1 |
문제: 프로그래머스 스쿨 - 연습문제 - 귤고르기
문제 풀이
유의사항
- tangerine 배열의 길이가 100,000이므로 O(N^2)으로 문제를 풀면 시간이 굉장히 오래 걸릴 것
- tangerine 배열의 원소의 범위가 10,000,000이하 이므로, 정렬 시 Bucket Sort를 사용하기엔 어려움이 있음
풀이 코드
1. 각 무게 별 귤의 갯수 세기
dict1 = {}
for i in tangerine:
if i in dict1:
dict1[i] += 1
else:
dict1[i] = 1
# 해당 부분 실행 이후, dict1에는 각 무게별 귤의 갯수가 들어가 있는 상태이다
파이썬의 Collection 모듈의 Counter함수를 사용하면 좀 더 효율적으로 이를 처리할 수 있겠지만... 길이가 100만 단위가 아니기에 문제를 푸는데에 큰 지장은 없겠다 싶어서 딕셔너리를 이용해 각 사이즈의 귤의 빈도 수를 세었다.
2. 귤의 갯수가 많은 순서대로 정렬하기
dict2 = sorted(dict1.items(), key=lambda x: -x[1])
3. 가장 많은 갯수의 귤 부터 상자를 채워 나가면서 몇 종류의 귤이 들어갔는지 세기
for i in dict2:
if k <= 0:
break
else:
k -= i[1]
answer += 1
전체 코드
def solution(k, tangerine):
answer = 0
dict1 = {}
for i in tangerine:
if i in dict1:
dict1[i] += 1
else:
dict1[i] = 1
dict2 = sorted(dict1.items(), key=lambda x: -x[1])
for i in dict2:
if k <= 0:
break
else:
k -= i[1]
answer += 1
return answer
반응형
'알고리즘 문제풀이' 카테고리의 다른 글
[프로그래머스 스쿨][Python] 멀리 뛰기 (0) | 2023.02.03 |
---|---|
[프로그래머스 스쿨][Python] 가장 큰 정사각형 찾기 (1) | 2023.02.02 |
[프로그래머스 스쿨][Python] 3 x n 타일링 (0) | 2023.01.31 |
[프로그래머스 스쿨][Python] 124 나라의 숫자 (0) | 2023.01.31 |
[프로그래머스 스쿨][Python] 게임 맵 최단거리 (0) | 2023.01.30 |