코테 노트/백준

백준 15903 카드 합체 놀이 Python 3

화요밍 2022. 2. 2. 22:18
728x90
반응형

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

 

15903번: 카드 합체 놀이

첫 번째 줄에 카드의 개수를 나타내는 수 n(2 ≤ n ≤ 1,000)과 카드 합체를 몇 번 하는지를 나타내는 수 m(0 ≤ m ≤ 15×n)이 주어진다. 두 번째 줄에 맨 처음 카드의 상태를 나타내는 n개의 자연수 a1,

www.acmicpc.net

 

최종 코드

import sys, heapq
def union_cards(cards, m):
    while m > 0:
        nsum = heapq.heappop(cards) + heapq.heappop(cards)
        m -= 1
        heapq.heappush(cards, nsum)
        heapq.heappush(cards, nsum)
    print(sum(cards))
input = sys.stdin.readline
n, m = map(int, input().split())
cards = list(map(int, input().split()))
heapq.heapify(cards)
union_cards(cards, m)

풀이 과정

  • 첫 번째 코드

m번 카드 합체를 진행하는데 매번 오름차순 정렬을 한 후, 가장 작은 카드 두 개를 합치는 방식으로 진행했다.

이 문제의 경우 입력 n이 최대 1000이기 때문에 시간 초과는 발생하지 않으나, 시간복잡도는 O(m*n log n)이다.

import sys
def union_cards(cards, m):
    while m > 0:
        cards.sort()
        m -= 1
        nsum = cards[0] + cards[1]
        cards[0] = cards[1] = nsum
    print(sum(cards))
input = sys.stdin.readline
n, m = map(int, input().split())
cards = list(map(int, input().split()))
union_cards(cards, m)

 

  • 두 번째 코드

heap 자료구조를 이용하였다.

pop 연산은 O(1)이 소요되고, push 연산은 힙 구조 재정렬하는데 걸리는 O(log2 n)이 소요된다.

따라서 시간복잡도가 O(m log2 n)이다.

import sys, heapq
def union_cards(cards, m):
    while m > 0:
        nsum = heapq.heappop(cards) + heapq.heappop(cards)
        m -= 1
        heapq.heappush(cards, nsum)
        heapq.heappush(cards, nsum)
    print(sum(cards))
input = sys.stdin.readline
n, m = map(int, input().split())
cards = list(map(int, input().split()))
heapq.heapify(cards)
union_cards(cards, m)

 

시간이 거의 2배나 차이가 난다. 복잡도를 고려해서 유리한 자료구조를 선택하는 것이 중요하다!

728x90
반응형

'코테 노트 > 백준' 카테고리의 다른 글

백준 2178 미로 탐색 Python 3  (0) 2022.02.03
백준 1260 DFS와 BFS Python 3  (0) 2022.02.03
백준 1700 멀티탭 스케줄링 Python 3  (0) 2022.01.30
백준 2212 센서 Python 3  (0) 2022.01.27
백준 11000 강의실 배정 Python 3  (0) 2022.01.27