본문 바로가기
백준(BackJoon) 문제 풀고 기록!

백준 알고리즘 1715번 : 카드 정렬하기 with [Python]

by 데이터 분석가가 되자 2024. 4. 21.
반응형

 

 

 

해당 문제는 우선순위 큐(Priority Queue)를 사용하여 효율적으로 해결할 수 있습니다.

 

파이썬에서 제공하는 heapq 모듈을 사용하여 우선순위 큐를 구현할 수 있습니다.

 

숫자 카드 묶음의 크기를 우선순위 큐에 넣은 다음,

가장 작은 두 묶음을 꺼내 그 합을 다시 우선순위 큐에 넣는 과정을 반복하면,

전체 비교 횟수를 최소화할 수 있습니다.

 

의사코드:

함수 최소비교횟수구하기(숫자카드묶음):
   우선순위큐 초기화
   숫자카드묶음을 순회하면서 각 묶음을 우선순위큐에 추가
   
   총비교횟수 = 0
   
   우선순위큐의 크기가 1보다 클 동안 반복:
      가장 작은 묶음 = 우선순위큐에서 제거
      두 번째로 작은 묶음 = 우선순위큐에서 제거
      
      현재비교횟수 = 가장 작은 묶음 + 두 번째로 작은 묶음
      총비교횟수에 현재비교횟수 추가
      
      합친 묶음 = 가장 작은 묶음 + 두 번째로 작은 묶음
      합친 묶음을 우선순위큐에 추가
      
   반환 총비교횟수

 

의사코드 구성 단계:

1. 우선순위 큐를 초기화하고, 입력 받은 숫자 카드 묶음의 크기들을 우선순위 큐에 추가합니다.

2. 우선순위 큐에서 가장 작은 두 개의 숫자 카드 묶음을 제거합니다.

3. 이 두 묶음을 합치고, 그 합의 크기로 비교 횟수를 계산하여 총 비교 횟수에 더합니다.

4. 합친 묶음을 다시 우선순위 큐에 추가합니다.

5. 우선순위 큐에 하나의 묶음만 남을 때까지 2~4단계를 반복합니다.

6. 총 비교 횟수를 반환합니다.

 

→ 이 접근 방식은 우선순위 큐를 통해 항상 가장 작은 두 개의 묶음을 합치므로,

     최소 비교 횟수로 모든 카드 묶음을 하나로 합칠 수 있습니다.

 


코드 구현 단계:

1. 중간 부분 : 핵심 알고리즘 구현:

 

가장 먼저, 숫자 카드 묶음들을 합치는 과정에서 최소 비교 횟수를 계산하는 핵심 알고리즘을 구현합니다.

이 부분에서는 우선순위 큐(최소 힙)을 사용하여 항상 가장 작은 두 카드 묶음을 찾아 합치는 과정을 반복합니다.

 

import heapq

def min_compare(card_set):
	heap = []
    for card in card_set:
    	heap.heappush(heap, card)
        
    total_compare = 0
    while len(heap) > 1:
    	first = heapq.heappop(heap)
        second = heapq.heappop(heap)
        
        total_compare += first + second
        heapq.heappush(heap, first + second)
        
     return total_compare

 

→ 이 코드는 주어진 숫자 카드 묶음들을 우선순위 큐에 넣고,

    큐에서 가장 작은 두 개의 묶음을 꺼내 그 크기를 합한 다음,

    그 합을 다시 큐에 넣는 과정을 모든 카드가 하나의 묶음이 될 때까지 반복합니다.

 

    각 단계에서의 비교 횟수는 합친 묶음의 크기와 같으며,

    이를 총 비교 횟수에 누적합니다.

 

 

2. 하단 부분 : 결과 출력

 

→ 핵심 알고리즘 구현 후, 이를 활용하여 주어진 입력에 대한 최소 비교 횟수를 계산하고

     결과를 출력하는 부분을 작성합니다.

 

# 최소 비교 횟수 계산
result = min_compare(card_set)

# 결과 출력
print(result)

 

 

3. 상단 부분 : 입력 처리

 

→ 마지막으로, 사용자로부터 숫자 카드 묶음의 개수와 각 묶음의 크기를 입력받는 부분을 작성합니다.

    이 부분은 전체 코드의 시작 부분에 위치합니다.

 

N = int(input()) # 숫자 카드 묶음의 개수 입력
card_set = [int(input()) for _ in range(N)] # 각 숫자 카드 묶음의 크기 입력

 

 

전체 코드 구현

 

import heapq

def min_compare(card_set):
    heap = []  # 들여쓰기를 공백 4개로 통일
    for card in card_set:
        heapq.heappush(heap, card)  # 들여쓰기를 공백 4개로 통일
        
    total_compare = 0
    while len(heap) > 1:
        first = heapq.heappop(heap)
        second = heapq.heappop(heap)
        
        total_compare += first + second
        heapq.heappush(heap, first + second)
        
    return total_compare
    
N = int(input())
card_set = [int(input()) for _ in range(N)]

result = min_compare(card_set)

print(result)

 

 

결과:

반응형