[BOJ]백준#23843 Gold 5 콘센트🎛🎛 (Python, 파이썬)

임준성·2022년 6월 6일
0

백준 Algorithm

목록 보기
27/59
post-thumbnail

백준 23322번
https://www.acmicpc.net/problem/23322


문제



후기

⏰ 풀이시간 2시간 ++⏰

문제를 접근하는 방법을 찾는 데 꽤 오랜 시간이 소요됐다.

일단 충전되는 데 오래 걸리는 콘센트부터 충전해야 한다는 것은 확실해 보여서 그러한 방식으로

접근했다.

  1. 충전중인 콘센트를 담을 list인 ans_li 를 만든다.

  2. ans_li에 들어있는 콘센트가 M개가 아니면서(자리가 비어있으면서) 충전할 콘센트가 남아있다면

  3. 충전시간이 오래 걸리는 콘센트부터 ans_li에 추가하고, 해당 콘센트는 list에서 제거한다.

  4. M개의 콘센트중 가장 충전되는데 적게 걸리는 콘센트의 시간을 k라는 변수로 저장한다.

  5. ans_li = [item for item in ans_li if item!=k] < 해당 코드로 k만큼 시간이 걸리는 콘센트를 제거한다.

(위와 같은 코드를 쓰는 이유는, 3개의 콘센트가 각각 6시간, 6시간, 7시간 남았을때, 중복되는 6시간짜리

콘센트를 모두 제거하기 위해서이다. )

  1. cnt에 k를 더하고 ( k만큼 시간 경과했단 이야기 ) 현재 남아 있는 콘센트는 충전되는데 k만큼 감소된 시간이 소요된다.
  1. k만큼 감소시켜서 0이 됐을 경우에는, 0이 된 콘센트도 제거해준다
  1. 충전중인 콘센트가 ans_li에 없고, 충전해야될 콘센트가 li에 없다면, 종료한다.

나의 풀이

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이 된 콘센트 역시 제거 
profile
아무띵크 있이

0개의 댓글