카드 정렬하기
1715번: 카드 정렬하기
정렬된 두 묶음의 숫자 카드가 있다고 하자. 각 묶음의 카드의 수를 A, B라 하면 보통 두 묶음을 합쳐서 하나로 만드는 데에는 A+B 번의 비교를 해야 한다. 이를테면, 20장의 숫자 카드 묶음과 30장
www.acmicpc.net
- 내 풀이 - 오답
- 가장 처음에는 heap을 써야하는 문제인지 몰르고 리스트로 풀었음
- → 앞에서 더한 값들이 뒤에값보다커질 수 있기 때문에 계속 sort해줄거 아니면 리스트 x
- 계속(n번) 최소인 값을구해야 하는 경우 heap사용
- → heap 사용한 첫 풀이: 오답
- heapq.heappush( heap , value )
- 값이 삽입된 후에 최소힙 구조가 됨
- heapq.heappop( heap )
- -> 최소힙의 루트가 반환되는 것
- 최소힙 루트가 반환되지 않고 순서대로 다음값이 반환된다고 생각해서 오답!
import heapq
n=int(input())
hp=[]
result=0
for _ in range(n):
m=int(input())
if not hp:
heapq.heappush(hp, m)
continue
x=heapq.heappop(hp) #이 부분에서 앞에서 넣은 30이 아니라 40이 반환된다고 생각해서 틀림
result+=m+x
heapq.heappush(hp,m+x)
print(result)
'''
10 20 - 30
30 40- 70
70 50 - 120
10 20 / 10 20 40 / 10 20 40 50
'''
- 재풀이
- heap을 사용하면 hp에 들어있는 값 중 계속해서 최소값 2개가 나오는 것
#시간복잡도를 줄이기 위해 heap 사용
import heapq
n=int(input())
hp=[]
result=0
#값을 모두 받아온 후에 계산 따로
for i in range(n):
heapq.heappush(hp, int(input()))
while len(hp)>1:
#hp에 들어있는 값중 계속해서 최소값 2개가 나오는 것
x1=heapq.heappop(hp)
x2=heapq.heappop(hp)
result+=x1+x2
heapq.heappush(hp,x1+x2)
print(result)
'코딩테스트 > BOJ' 카테고리의 다른 글
| 테케는 맞는데 오답- 왜안되는지 모르겠음 (0) | 2023.03.04 |
|---|---|
| [백준][분할정복] 1992. 쿼드트리 (0) | 2023.03.03 |
| [백준] [브론즈 3] 4153. 직각삼각형 (0) | 2023.02.28 |
| [백준] [브론즈 3] 1085. 직사각형에서 탈출 (0) | 2023.02.28 |
| [백준] [실버 1] [BFS] 돌다리 (0) | 2023.02.28 |