백준 23322번
https://www.acmicpc.net/problem/23322
문제
후기
문제를 접근하는 방법을 찾는 데 꽤 오랜 시간이 소요됐다.
일단 충전되는 데 오래 걸리는 콘센트부터 충전해야 한다는 것은 확실해 보여서 그러한 방식으로
접근했다.
충전중인 콘센트를 담을 list인 ans_li 를 만든다.
ans_li에 들어있는 콘센트가 M개가 아니면서(자리가 비어있으면서) 충전할 콘센트가 남아있다면
충전시간이 오래 걸리는 콘센트부터 ans_li에 추가하고, 해당 콘센트는 list에서 제거한다.
M개의 콘센트중 가장 충전되는데 적게 걸리는 콘센트의 시간을 k라는 변수로 저장한다.
ans_li = [item for item in ans_li if item!=k] < 해당 코드로 k만큼 시간이 걸리는 콘센트를 제거한다.
(위와 같은 코드를 쓰는 이유는, 3개의 콘센트가 각각 6시간, 6시간, 7시간 남았을때, 중복되는 6시간짜리
콘센트를 모두 제거하기 위해서이다. )
나의 풀이
import sys
input = sys.stdin.readline
import copy
N, M = map(int,input().split())
lili = sorted(list(map(int,input().split())))
lili.reverse()
li = copy.deepcopy(lili)
#큰거와 큰거끼리 묶으면서, 제일 큰거 다음 콘센트에서 충전이 끝나면, 그 다음으로 남은 콘센트중 가장 큰 콘센트를 가져온다.
cnt = 0
ans_li = []
while True:
if len(ans_li) == 0 and len(li)==0: #충전중인 콘센트가 없고, 충전해야될 콘센트가 없다면
print(cnt)
exit()
for i in range(M):
if len(ans_li) < M: #콘센트가 비어있다면
if len(li)!=0: #충전할 콘센트가 남아있다면
ans_li.append(li[0]) #가장 오래걸리는 콘센트부터
li.pop(0)
k= min(ans_li) # 충전중인 콘센트중 가장 시간이 조금남은 콘센트
ans_li = [item for item in ans_li if item!=k] #가장 시간조금남은 콘센트 충전완료
cnt += k
if len(ans_li)!=0:
for i in range(len(ans_li)):
ans_li[i] = ans_li[i]-k # 가장 시간 조금남은 콘센트를 충전한 시간만큼 현재 남아있는 콘센트들의 필요시간 감소
ans_li = [item for item in ans_li if item!=0] # 0이 된 콘센트 역시 제거