Beakjoon 23351, 물 주기
solved.ac Silver3
Greedy 알고리즘
문제
랑이 집사는 고양이들이 좋아한다는 캣닢을 직접 재배하려고 한다.
일직선으로 놓여진 N개의 화분에 캣닢이 하나씩 심어져 있다.
각 화분은 초기에 K만큼의 수분을 머금고 있고, 매일 아래와 같은 일이 순서대로 일어난다.
- 랑이 집사가 연속된 A개의 화분에 물을 준다. 이 때 물을 준 화분의 수분은 B만큼씩 증가한다.
- 모든 화분의 수분이 1씩 감소한다.
- 수분이 0이 된 화분에 있는 캣닢은 죽는다.
모든 캣닢이 살아 있는 기간이 최대한 길어지도록 물을 줄 때, 첫 캣닢이 죽는 날짜를 출력하는 프로그램을 작성하시오. 첫 날은 1일이다.
입력
첫째 줄에 자연수 N, K, A, B가 공백을 사이에 두고 주어진다. (2≤N≤100, 1≤K≤100, 1≤A×B<N
는 N의 약수)출력
모든 캣닢이 살아 있는 기간이 최대한 길어지도록 물을 줄 때, 첫 캣닢이 죽는 날짜를 출력한다.
Solution
n, k, a, b = map(int, input().split())
d = n/a
data = []
count = 0
check = 0
for _ in range(int(d)):
data.append(k)
while True:
for i in range(int(d)):
data[i] -= 1
data[check] += b
check += 1
if check == int(d):
check = 0
count += 1
if min(data) == 0:
print(count)
break
풀이
어차피 A가 N의 약수이기 때문에 나누어 떨어지게 됩니다. 그렇다면 N을 A로 나눈것을 하나로 잡은 list를 만들어줍니다. 이 리스트는 모두 같은 K개의 수분을 가지고 있습니다. 하루가 시작되면 모든 캣닢의 수분을 -1 해주고 check를 통해 data의 순서대로 -B만큼 해줍니다. 캣닢이 죽는 날짜를 구하는 것 이기 때문에 while 루프가 돌아갈 때마다 count를 추가해주면서 0이 되면 count를 출력합니다.