알고리즘 문제 풀이

83. Python 백준 1715 번 카드 정렬하기 자세한 설명

코딩하는 덕구 🐶 2023. 1. 16. 20:43
728x90
반응형

안녕하세요 코딩하는 덕구입니다.

그리디 알고리즘인 BOJ 1715 번 카드 정렬하기 입니다.

https://www.acmicpc.net/problem/1715

 

1715번: 카드 정렬하기

정렬된 두 묶음의 숫자 카드가 있다고 하자. 각 묶음의 카드의 수를 A, B라 하면 보통 두 묶음을 합쳐서 하나로 만드는 데에는 A+B 번의 비교를 해야 한다. 이를테면, 20장의 숫자 카드 묶음과 30장

www.acmicpc.net

 

 

먼저  1715 파이썬 정답 코드입니다.

import heapq
import sys
input = sys.stdin.readline

N = int(input())
cards = []
res = 0

for i in range(N):
    heapq.heappush(cards, int(input()))

for _ in range(N-1):
    merge = heapq.heappop(cards) + heapq.heappop(cards)
    res += merge
    heapq.heappush(cards, merge)
print(res)

 

두 카드 묶음 A, B를 합쳐 정렬된 하나의 카드 묶음으로 만들기 위해서는 A + B 번의 비교가 필요합니다.

A, B가 작으면 작을 수록 비교하는 횟수가 적어지기 때문에 가능한 작은 크기의 카드 묶음으로 만들어야 되고,

이를 위해서는 가장 작은 카드의 묶음 2개를 선택하여 새로운 카드 묶음으로 만들며 비교해나가면 됩니다.

만약 큰 카드의 묶음을 뽑아서 새로운 카드 묶음으로 만들어가면 바교해야되는 카드 수가 점점 늘어나겠죠.

 

즉 카드 묶음의 집합에서 가장 작은 크기의 두 카드 묶음 A, B를 뽑아서 비교횟수를 더하고,

새로 만들어진 A +B 크기의 카드 묶음을 집합에 넣으며

비교할 카드 묶음이 없어질 때 까지 반복하면 됩니다.

 

위의 직관으로 파이썬 코드를 구현해봅시다.

카드 묶음을 저장하기 위해 리스트를 생성하고,

리스트의 최소값, 최대값을 구하는데 가장 효율적인 자료구조인 heap을 구현해줍니다.

 

import heapq
cards = []

 

카드 묶음을 묶음 개수만큼 입력받아 힙 자료구조 cards 에 넣어줍니다.

for i in range(N):
    heapq.heappush(cards, int(input()))

 

이후 N-1 번 동안 (카드 묶음이 1개 남을때 까지)

가장 작은 크기의 두 카드 묶음을 하나의 카드 묶음으로 만들고, 계산 횟수를 더합니다.

그리고 만들어진 새로운 카드 묶음을 힙에 다시 넣어줍니다.

for _ in range(N-1):
    merge = heapq.heappop(cards) + heapq.heappop(cards)
    res += merge
    heapq.heappush(cards, merge)

 

카드묶음이 하나 남으면 지금까지 연산한 횟수를 출력하면 됩니다.

print(res)

 

백준 1715 번 카드 정렬하기 파이썬 최종 코드 입니다.

import heapq
import sys
input = sys.stdin.readline

N = int(input())
cards = []
res = 0

for i in range(N):
    heapq.heappush(cards, int(input()))

for _ in range(N-1):
    merge = heapq.heappop(cards) + heapq.heappop(cards)
    res += merge
    heapq.heappush(cards, merge)
print(res)

 

 

Python 백준 1715 번 카드 정렬하기 파이썬 코드와 함께 자세한 설명 이었습니다.

감사합니다.

 

 

728x90
반응형