조금씩 꾸준하게
[백준] 23843번 - 콘센트 (Python) 본문
반응형
문제
https://www.acmicpc.net/problem/23843
23843번: 콘센트
광재는 전자기기 대여사업을 시작했다. 퇴근하기 전에 다음날 손님들에게 빌려줄 N개의 전자기기를 충전하려 한다. 사용 가능한 콘센트는 M개가 있고, 성능은 모두 동일하다. 전자기기들은 한
www.acmicpc.net
접근 방법
충전에 필요한 시간이 2^k 꼴이므로 그리디 알고리즘으로 접근할 수 있다.
1. 충전 시간을 내림차순으로 정렬한다.
2. 첫 번째 콘센트에 가장 긴 것을 충전한다.
3. 그리고 그 다음 콘센트에는 남은 기기들 중에서 첫 번째 콘센트 길이를 넘지 않도록 최대한 넣고, 이를 반복한다.
4. 마지막 콘센트까지 3번을 완료했다면 첫 번째 콘센트로 돌아가 남은 기기들에 대해 2~3번을 반복한다.
예를 들어 8, 4, 4, 1, 1 이 있다면 8 / 4, 4 / 1, 1 과 같이 나눌 수 있다.
이게 가능한 이유는 2^k꼴로 정렬되어 있어 5 / 3 3과 같이 자리가 남는데 넣으면 초과되는 경우가 일어나지 않기 때문이다.
코드
import sys
N, M = map(int, sys.stdin.readline().rstrip().split())
arr = list(map(int, sys.stdin.readline().rstrip().split()))
arr.sort(reverse=True)
totalTime = [0] * M # totalTime[i]는 i번째 콘센트로 충전하는 전자기기 들의 시간 총합
idx = 0 # 현재 몇 번째 콘센트를 가리키는지
for i in range(len(arr)):
if idx == 0: # 첫 번째 콘센트에 남은 것중 가장 충전 시간이 긴 것을 넣는다.
totalTime[idx] += arr[i]
idx = (idx + 1) % M
continue
# 나머지 콘센트에는 이전 콘센트의 시간 총합을 넘지 않도록 최대한 넣는다.
totalTime[idx] += arr[i]
if totalTime[idx] == totalTime[idx - 1]:
idx = (idx + 1) % M
print(totalTime[0]) # 첫 번째 콘센트가 가장 충전이 오래 걸리고 이 시간이 곧 총 충전 시간이다.
풀이 정보
시도 횟수: 1회
총 문제 풀이에 걸린 시간: 15분 9초
반응형
'ProblemSolving > BOJ' 카테고리의 다른 글
[백준] 9184번 - 신나는 함수 실행 (Python) (0) | 2023.03.10 |
---|---|
[백준] 5555번 - 반지 (Python) (0) | 2023.03.07 |
[백준] 15559번 - 내 선물을 받아줘 (Python) (0) | 2023.03.04 |
[백준] 1972번 - 놀라운 문자열 (Python) (0) | 2023.02.26 |
[백준] 1895번 - 필터 (Python) (0) | 2023.02.24 |
Comments