파이썬 알고리즘

[파이썬] 13748 진기의 최고급 붕어빵

뜻 지, 깨달음 오 2022. 10. 1. 12:31

https://swexpertacademy.com/main/talk/solvingClub/problemView.do?solveclubId=AYJ7KE5qKy8DFASv&contestProbId=AX8BikeKZ3sDFARO&probBoxId=AYKLHkm6QIwDFAVG&type=USER&problemBoxTitle=3.+list+%EC%B6%94%EA%B0%80%EB%AC%B8%EC%A0%9C&problemBoxCnt=4 

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

n번 탐색을 3번 해야돼서 실행시간이 조금 긴 코드이지만

이런 발상을 했다는 측면에서 기록하고 싶은 문제..

 

일단 진기는 m초동안 k개의 빵을 만든다.

사람은 0초에서 11111초까지 도착할 수 있기 때문에,

11112길이의 bucket을 만들고, m의 배수마다 k의 배수를 추가하는 코드를 짰다.

T = int(input())

for tc in range(1, T + 1):
    N, M, K = map(int, input().split())  # n명, m초동안 k개
    arr = list(map(int, input().split()))

    bbang_made = [0] * 11112
    cnt = 0
    for i in range(11112):
        if i > 0 and i % M == 0:
            cnt += K
            bbang_made[i] = cnt
        elif bbang_made[i] == 0:
            bbang_made[i] = bbang_made[i - 1]

여기까지 짜고

print(bbang_made)

를 해보면 결과가 이렇게 나온다.

tc1에서 진기는 2초마다 빵을 2개씩 만들기 때문에,

손님을 고려하지 않고 진기가 만드는 빵만 본다면 해당 sec에 만든 빵은 저렇게 표현할 수 있다.

 

이제 손님이 다녀갈 차례...

손님이 다녀가는 시간이 tc에 주어졌으니, 해당 index부터 끝까지 만들어진 붕어빵 개수에 1을 빼면 된다.

    for j in range(len(arr)):
        for l in range(arr[j], len(bbang_made)):
            bbang_made[l] -= 1

이거까지 실행하고 print를 해보면, 붕어빵을 만들고, 손님이 사간 후 남은 붕어빵이 몇개인지 확인할 수 있다.

그러면 이제 이 list에서 남은 붕어빵의 개수가 0 이하가 되면

붕어빵이 판매될 수 없음을 의미한다.

    flg = 0
    for k in range(len(bbang_made)):
        if bbang_made[k] < 0:
            flg += 1

    if flg > 0:
        print(f'#{tc} Impossible')
    else:
        print(f'#{tc} Possible')

 

 

 

전체 풀이)

T = int(input())
 
for tc in range(1, T+1):
    N, M, K = map(int, input().split()) #n명, m초동안 k개
    arr = list(map(int, input().split()))
 
    bbang_made = [0]*11112
    cnt = 0
    for i in range(11112):
        if i>0 and i%M==0:
            cnt += K
            bbang_made[i] = cnt
        elif bbang_made[i]==0:
            bbang_made[i] = bbang_made[i-1]
    # print(bbang_made)
 
    for j in range(len(arr)):
        for l in range(arr[j], len(bbang_made)):
            bbang_made[l] -=1
 
    flg = 0
    for k in range(len(bbang_made)):
        if bbang_made[k]<0:
            flg +=1
    # print(bbang_made)
    # print(flg)
 
    if flg>0:
        print(f'#{tc} Impossible')
    else:
        print(f'#{tc} Possible')