[백준,Python]15903번 카드 합체 놀이(Greedy)
15903번: 카드 합체 놀이
첫 번째 줄에 카드의 개수를 나타내는 수 n(2 ≤ n ≤ 1,000)과 카드 합체를 몇 번 하는지를 나타내는 수 m(0 ≤ m ≤ 15×n)이 주어진다. 두 번째 줄에 맨 처음 카드의 상태를 나타내는 n개의 자연수 a1,
www.acmicpc.net
이번 문제의 알고리즘은 Greedy이고, 1. 처음 푼 풀이와 2. 효율적인 풀이를 비교하며 설명하려고 한다.
1. 처음 푼 풀이
import sys
input = sys.stdin.readline
a,b = map(int, input().split())
card = list(map(int,input().split()))
for i in range(b):
card = sorted(card)
cover = card[0] + card[1]
card[0] = cover
card[1] = cover
print(sum(card))
-다음과 같이 비교적 간단하게 생각할 수 있는 풀이 방법이다. m번 합체할 때 마다 정렬 해주고, 인덱스 기준 0, 1을 연산값으로 바꿔주는 알고리즘으로 풀게 되었다. 반복문 안에서 sort를 하게 될 경우 다시 넣을 때마다 sort 함수를 작동 시키므로 시간복잡도는 O(nlogn)이 된다. 그래도 요구하는 식이 복잡하지 않아 간단하게 구현하여 정답을 내게 되었다.
2. 효율적인 풀이
import sys
import heapq
input = sys.stdin.readline
n,m = map(int, input().split())
card = list(map(int,input().split()))
heapq.heapify(card)
for i in range(m):
card1 = heapq.heappop(card)
card2 = heapq.heappop(card)
heapq.heappush(card, card1+card2)
heapq.heappush(card, card1 + card2)
print(sum(card))
-heap으로 구현한 우선순위 큐를 사용하게 되면 카드 2개를 뽑을 때 마다 정렬하는 것이 아니라 heappop()를 통해 값을 빼주기만 하고 다시 heappush()만 하면 되기에 오히러 더 간단하게 풀 수 있었다. 자료구조 heap에서 삽입연산의 시간 복잡도는 O(logn)이다. 첫번째 풀이보다 훨신 효율적이다는 것을 알 수 있었다.
두 풀이에 시간을 비교해보면 다음과 같은 결과를 확인할 수 있었다.
'PYTHON > Algorithm' 카테고리의 다른 글
[백준,Python]11651번 좌표 정렬하기 2(Sort) (0) | 2024.05.06 |
---|---|
[백준,Python]7576번 토마토(Graph Search/BFS, 시간초과 해결) (0) | 2021.02.21 |
[백준,Python]16953번 A->B(Greedy) (0) | 2021.02.12 |
[백준,Python]1003번 피보나치 함수(DP,dynamic programming) (2) | 2020.08.19 |
[백준,Python]1932번 정수 삼각형(DP,dynamic programming) (0) | 2020.08.17 |
댓글