Study/algorithm
[softeer] [21년 재직자 대회 본선] 트럭 (python)
성장형감자
2022. 9. 14. 14:15
728x90
반응형
https://softeer.ai/practice/info.do?idx=1&eid=631&sw_prbl_sbms_sn=82669
Softeer
연습문제를 담을 Set을 선택해주세요. 취소 확인
softeer.ai
문제 회고
처음엔 돈 범위만큼 배열을 만들어 각각의 이익을 얻으려면 필요한 size를 모두 넣어서 구하려고 했다.
지금 생각해보면 매우 무식한 방법이고 시간 초과가 뻔했다.
인터넷 검색을 좀 해봐서 각각의 buyer가 제시한 사이즈에 맞는 금액과 시나리오를 정렬을 하면 가장 사이즈부터 시나리오에 부합하는지 찾기 때문에 더 빠르게 답을 찾을 수 있었다.
만약 해당 buyer가 이전에 이미 지불한 금액이 있었다면 그 금액과 비교해서 더 큰 금액일 시 바꿔주는 부분도 필요했다.
그리고 처음 정렬을 해주었기 때문에 나중에 다시 input으로 받을 때의 순서로 돌리기 위해서 index를 저장하는 것이 중요했다.
import sys
n = int(sys.stdin.readline())
offer = []
for i in range(n):
tmp = list(map(int, sys.stdin.readline().split()))
for j in range(1, len(tmp), 2):
offer.append([tmp[j], tmp[j + 1], i + 1])
m = int(sys.stdin.readline())
tmp = list(map(int, sys.stdin.readline().split()))
scenarioes = []
for i in range(m):
scenarioes.append([tmp[i], i + 1])
offer.sort()
scenarioes.sort()
total = 0
prev_pay = [0] * (n + 1)
s_index = 0
for i in range(len(offer)):
size, payment, buyer = offer[i][0], offer[i][1], offer[i][2]
if payment > prev_pay[buyer]:
total += payment - prev_pay[buyer]
prev_pay[buyer] = payment
while s_index < len(scenarioes) and scenarioes[s_index][0] <= total:
scenarioes[s_index].append(size)
s_index += 1
scenarioes.sort(key=lambda x: x[1])
for i in scenarioes:
if len(i) <= 2:
print(-1, end=' ')
else:
print(i[2], end=' ')
728x90
반응형