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')
'파이썬 알고리즘' 카테고리의 다른 글
[파이썬] 백준 2605 줄 세우기 (1) | 2022.10.01 |
---|---|
[파이썬] 6190 정곤이의 단조 증가하는 수 (1) | 2022.10.01 |
[파이썬] 백준 2309 일곱 난쟁이 풀이 2가지 (1) | 2022.09.30 |
[파이썬] 백준 13300 방배정 풀이 (1) | 2022.09.25 |
백준 1244 스위치 켜고 끄기 파이썬 풀이 (1) | 2022.09.24 |