새로운 블로그로 이전 작업을 진행하고 있어 포스트가 새로 작성되고 있지 않습니다.

빠른 시일 내에 새로운 블로그로 인사드리겠습니다.

새로운 블로그 : https://unho.vercel.app/

본문 바로가기
알고리즘 문제풀이/Python

[백준] 1715 카드정렬하기

by 언호 2021. 12. 23.

문제


풀이 과정

1) 문제 이해 및 접근

가장 작은 수들을 우선으로 더해주면 되므로 그리디로 접근했습니다.

연산한 수를 리스트에 다시 넣고 그 중 가장 작은 수를 다시 빼서 사용해야 하므로 최소 힙을 사용했습니다.

2) 알고리즘

  • 그리디 알고리즘
  • 최소 힙

3) 풀이 코드

사용 언어 - Python

import sys
import heapq
sys.stdin = open('input.txt')


N = int(sys.stdin.readline())   # 숫자 개수
heap = []                       # 힙으로 사용할 리스트
answer = 0                      # 정답 변수

for _ in range(N):              # 숫자들을 모두 최소힙에 푸시
    heapq.heappush(heap, int(sys.stdin.readline()))

while len(heap) > 1:                        # 최소힙 안에 2개 이상 있으면 반복
    node_1 = heapq.heappop(heap)            # 가장 작은 수
    node_2 = heapq.heappop(heap)            # 두번째로 작은 수
    answer += node_1 + node_2               # 정답에 더함
    heapq.heappush(heap, node_1 + node_2)   # 더한 수를 최소힙에 추가

print(answer)

결과 및 학습한 내용

1) 어려웠던 내용

규칙을 발견하는데 어려움이 있었습니다.

연산한 결과를 다시 리스트에 넣고 그 중 가장 작은 수 2개를 찾아서 다시 연산 해야했는데, 특수한 케이스가 있을거라는 생각에 시간이 더 많이 소요되었습니다.

2) 새롭게 학습한 내용

특별히 없습니다.


문제 링크

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

 

1715번: 카드 정렬하기

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

www.acmicpc.net

 

 

※ 오류 및 오타, 다른 의견이 있는 경우 댓글을 남겨주시면 감사하겠습니다

'알고리즘 문제풀이 > Python' 카테고리의 다른 글

[백준] 2573 빙산  (0) 2021.12.25
[백준] 14503 로봇 청소기  (0) 2021.12.24
[백준] 10868 최솟값  (0) 2021.12.22
[백준] 2357 최솟값과 최댓값  (0) 2021.12.21
[프로그래머스] 트리 트리오 중간값  (0) 2021.12.20

댓글