[Softeer] 금고털이

ran·2023년 4월 19일

알고리즘(파이썬)

목록 보기
13/14

쉬운 문제다. 단순히 무게당 가격이 큰 순서로 정렬해줘서, 금속무게가 배냥에 넣을 수 있는 무게보다 작으면 금속 전부를 넣고, 금속무게가 배냥에 넣을수 있는 무게를 넘으면, 배냥에 넣을 수 있는 무게 만큼의 금속을 넣으면 된다.

이렇게 간단한 문제를 왜!! 벨로그에 남기냐면,, 계속 시간초과가 터지기 때문이다...
분명 제한이 최대 10^6인데, 시간복잡도는 O(nlogn)로 도저히 3초의 시간을 넘지 않는다고 생각하는데, 계속 몇몇 테케에서 걸리는 것이다.

그래서 시간을 최소화 하기위해 아래와 같이 코드를 짜봤다.

# 3초 제한에 nlogn 복잡도 인데, 초과나는것이 이해가 안가지만
# 최소한의 시간을 쓸 수 있도록 하자
# 
import sys
input=sys.stdin.readline
w,n = map(int, input().split())

jewel=[list(map(int, input().split()))for _ in range(n)]
jewel=sorted(jewel, key = lambda x:x[1], reverse=True)
price=0

for mj,pi in jewel:
    if w>mj:
        price+=mj*pi
        w-=mj
    else:
        price+=w*pi
        break
print(price)

여기서 핵심은 뒤의 것(가격)만 정렬하는 lambda이다.
불필요한 정렬 연산을 줄여줌으로써, 시간복잡도를 줄인다.

profile
Backend Developer

0개의 댓글