백준 23843번 - 콘센트
콘센트 문제 바로 가기
풀이 날짜: 2026-03-09
baekjoon 알고리즘 문제 풀이
풀이 코드
import sys
input = sys.stdin.readline
import heapq
n,m = map(int, input().split())
data = list(map(int, input().split()))
data.sort(reverse=True)
heap = []
for i in range(min(m,n)):
heapq.heappush(heap, data[i])
for i in range(m,n):
a = heapq.heappop(heap)
new = a + data[i]
heapq.heappush(heap, new)
print(max(heap))
문제 핵심 요약:
여러 개의 전자기기를 제한된 수의 멀티탭에 연결하여 충전할 때, 모든 충전이 완료되는 최소 시간을 구하는 문제이다. 따라서 전자기기를 어떤 순서로 충전기에 배치해야 전체 충전이 끝나는 시간을 최소화할 수 있는지 계산하는 것이 핵심이다.
접근 방법
이 문제는 여러 작업을 동시에 처리할 때 가장 빨리 끝나는 작업을 기준으로 다음 작업을 배치하는 스케줄링 문제로 볼 수 있다. 충전기가 여러 개 존재하기 때문에 각각의 충전기가 언제 비는지를 관리해야 하는데, 이때 가장 빨리 끝나는 충전기를 빠르게 찾을 수 있는 자료구조가 필요했다. 파이썬에서는 heapq를 사용하면 가장 작은 값(가장 빨리 끝나는 시간)을 효율적으로 꺼낼 수 있으므로, 각 충전기의 현재 충전 완료 시간을 힙(Heap)에 저장하여 관리하였다.
풀이 전략
먼저 충전 시간이 긴 전자기기부터 처리하는 것이 전체 시간을 최소화하는 데 유리하기 때문에, 전자기기의 충전 시간을 내림차순으로 정렬하였다. 그 다음 처음 m개의 전자기기를 각각의 충전기에 바로 연결하고, 이후 남은 전자기기들은 다음과 같은 과정을 반복했다.
- 힙에서 가장 빨리 끝나는 충전기를 꺼낸다.
- 해당 충전기에 다음 전자기기의 충전 시간을 더한다.
- 새롭게 계산된 충전 완료 시간을 다시 힙에 넣는다.
이 과정을 모든 전자기기가 배치될 때까지 반복하면, 힙에는 각 충전기의 최종 충전 완료 시간이 저장된다. 이 중 가장 큰 값이 전체 충전이 끝나는 최소 시간이 된다.