반응형
lv. 2 단계의 코딩 테스트 연습 문제 중 '귤 고르기'에 대한 풀이를 설명하고 있습니다.
프로그래머스 - 귤 고르기 (Python)
코딩 테스트 연습 문제 풀이
위의 목차를 클릭하면 해당 글로 자동 이동 합니다.
원리
- 귤이 사이즈 별로 몇 개씩 존재하는 최초에 저장한다.
- sizes[30] = 2 인 경우, 30 사이즈의 귤이 2개가 존재하는 것이다.
- 이제 sizes 배열의 0 ~ 최대 귤 사이즈인 10000000 까지 탐색을 하며 array에 특정 사이즈의 귤이 몇 개씩 있는지 담는다.
- 위의 예제를 활용하면 array = [[30, 2]] 와 같이 담긴다.
- 이제 1번째 열을 기준으로 정렬한다.
- 즉, 개수가 많은 사이즈가 앞으로 오도록 내림차순 정렬을 수행한다.
- 정렬된 Array의 앞에서부터 탐색하면서 내가 선택해야 되는 귤의 개수 k가 0이 될 때까지 귤을 고른다.
- 해당 코드는 아래와 같다.
for element in array:
if k != 0:
if element[1] <= k:
k -= element[1]
answer += 1
elif element[1] > k:
answer += 1
break
else:
break
- 가장 적은 종류로 k개를 담아야 하므로, 많은 수의 귤을 갖는 사이즈부터 선택하면 된다.
- Array의 첫 번째 원소부터 탐색하는 이유이다.
- i번째에 있는 사이즈의 귤을 선택하는 경우를 생각해보자
- i번째 원소는 [사이즈, 귤의 개수] 로 구성되어 있다.
- 이때, 귤의 개수가 내가 선택해야할 k보다 작거나 같다면 해당 사이즈의 귤을 선택하면 된다.
- 따라서 k에서 해당 사이즈의 귤의 개수 (number(i))를 뺀다.
- 다음부터는 k - number(i) 의 수 만큼을 더 선택해야한다.
- 그리고 한 종류의 귤을 선택했으므로, answer를 +1 한다.
- 만약 귤의 개수가 k보다 크면, 해당 귤을 선택하면 k가 꽉차므로 더 이상 다음 사이즈의 귤을 선택할지 말지 고민할 필요가 없다.
- 따라서 answer를 +1하고, 순회를 멈춘다.
- 마찬가지로, k == 0 즉 더 이상 선택할 수 있는 귤이 없을 때에도 순회를 멈춘다.
- 전체 코드는 아래와 같다.
코드
def solution(k, tangerine):
answer = 0
sizes = [0 for _ in range(10000000)]
for t in tangerine:
sizes[t-1] += 1
array = []
for size, n in enumerate(sizes):
if n > 0:
array.append([size + 1, n])
array.sort(key=lambda x: x[1], reverse=True)
for element in array:
if k != 0:
if element[1] <= k:
k -= element[1]
answer += 1
elif element[1] > k:
answer += 1
break
else:
break
return answer
정답률 70%를 보여주는 만큼 아주 단순한 문제였다.
반응형
'알고리즘' 카테고리의 다른 글
프로그래머스 - 도넛과 막대 그래프 (Python) (0) | 2024.10.13 |
---|---|
프로그래머스 - 시소 짝꿍 (Python) (0) | 2024.10.13 |
프로그래머스 - 무인도 여행 (Python) (0) | 2024.10.12 |
프로그래머스 - 구명 보트 (Python) (0) | 2024.10.12 |
프로그래머스 - 마법의 엘리베이터 (Python) (0) | 2024.10.12 |