목표
알고리즘 실력 향상을 위해 백준에서 출제하는 문제들을 풀어본다.
사용 언어
Python
일정
2회차: 7/2 19:00 ~ 22:00
목표 : 백준 그리디 알고리즘 관련 3 - 4 문제 풀기
큰 단위 동전이 작은 단위 동전의 배수관계가 성립한다는 점이 이 문제의 핵심이다. 이 조건으로 인해 그리디 알고리즘이 성립한다. 따라서 K원을 가장 큰 단위 동전에서 작은 단위 순서로 줄이면서 동전의 개수를 구한다.
n, k = map(int, input().split())
money_list = list()
for i in range(n):
money_list.append(int(input()))
count = 0
money_list.reverse()
for i in money_list:
count += k // i
k = k % i
print(count)
결과
이를 코드로 나타내면 아래와 같다.
import sys
test = int(sys.stdin.readline())
for i in range(test):
n = int(sys.stdin.readline())
vt_list = list()
for j in range(n):
paper, meet = map(int, sys.stdin.readline().split())
vt_list.append([paper, meet])
vt_list_sortp = sorted(vt_list, key = lambda x : x[0])
cnt = 1
meet_score = vt_list_sortp[0][1]
for j in range(1, n):
if vt_list_sortp[j][1] < meet_score:
meet_score = vt_list_sortp[j][1]
cnt += 1
print(cnt)
결과
문제 자체는 매우 단순하다. 그냥 오름차순으로 정렬하여 그 값을 계속 더하는 방식이다. 하지만 이를 곧이 곧대로 코드를 구현할 경우 시간초과가 발생했다. 이를 방지하기 위해 sys.stdin.readline() 과 heapq 자료구조를 이용한다.
import sys
import heapq
n = int(sys.stdin.readline())
card_list = []
for _ in range(n):
heapq.heappush(card_list, int(sys.stdin.readline()))
if len(card_list) == 1: #카드리스트가 한 개인 경우
print(0)
else:
result = 0
while len(card_list) > 1:
temp_sum = heapq.heappop(card_list) + heapq.heappop(card_list)
result += temp_sum
heapq.heappush(card_list, temp_sum)
print(result)
결과
import sys
import heapq
n, k = map(int, sys.stdin.readline().split())
jew = []
for _ in range(n):
heapq.heappush(jew, list(map(int, sys.stdin.readline().split())))
bags = []
for _ in range(k):
bags.append(int(sys.stdin.readline()))
bags.sort()
result = 0
temp_jew = []
for bag in bags:
while jew and bag >= jew[0][0]:
heapq.heappush(temp_jew, -heapq.heappop(jew)[1])
if temp_jew:
result -= heapq.heappop(temp_jew)
elif not jew:
break
print(result)
결과