문제
1715번: 카드 정렬하기
정렬된 두 묶음의 숫자 카드가 있다고 하자. 각 묶음의 카드의 수를 A, B라 하면 보통 두 묶음을 합쳐서 하나로 만드는 데에는 A+B 번의 비교를 해야 한다. 이를테면, 20장의 숫자 카드 묶음과 30장
www.acmicpc.net
정답
import heapq
n = int(input())
heap = []
for i in range(n):
data = int(input())
heapq.heappush(heap,data)
# 만들어놓은 heap배열에 data를 넣을건데 기존의 값들과 비교해서 더 작은 값이 앞에 오도록 넣음
# 데이터의 삽입,수정,갱신에 따라 자동으로 재정렬됨
result = 0
while len(heap) != 1: # heap에 원소가 하나만 남게 되면 그 값은 result와 같을 것이므로 결과를 출력.
# 가장 작은 값 두개 꺼내기
one = heapq.heappop(heap)
two = heapq.heappop(heap)
# 가장 작은 값 두 개를 결과값에 더하고 다시 heap에 넣기
# -> 자동으로 정렬되기 때문에 다음에 또 가장 작은 값 2개를 꺼낼 수 있음음
sum_value = one+two
result += sum_value
heapq.heappush(heap,sum_value)
print(result)
풀이
논리적으로 가장 작은 묶음을 두 개씩 더해나가면 최소횟수의 해를 찾을 수 있다는 건 알았는데
이걸 코드로 어떻게 구현할 지 몰라서 빠르게 답지를 참고했다.
데이터의 값이 작은 걸 높은 우선순위로 자동 정렬해주는 heapq를 사용해서 풀면 되는 문제였다.
이런건 그냥 많이 풀어보면서 익히는게 답인듯..!
참고
이것이 취업을 위한 코딩테스트다.(with.python)
'코딩테스트 > 👩💻 이코테' 카테고리의 다른 글
[이코테/다이나믹프로그래밍/DP] 금광(정답,풀이) (1) | 2023.10.19 |
---|---|
[이코테/이진탐색/백준] 공유기 설치(정답,풀이) (0) | 2023.10.18 |
[이코테/bfs/삼성 기출] 인구 이동(정답, 풀이, 풀리지 않는 의문..) (0) | 2023.10.17 |
[이코테/dfs/백준] 감시 피하기(정답,풀이) (0) | 2023.10.15 |
[이코테/dfs/삼성기출] 연산자 끼워넣기(정답,해설) (0) | 2023.10.15 |