[백준] 23351 물 주기

박선영·2023년 10월 18일
0
post-thumbnail

23351 물 주기

📄Description

랑이 집사는 고양이들이 좋아한다는 캣닢을 직접 재배하려고 한다.
일직선으로 놓여진 NN개의 화분에 캣닢이 하나씩 심어져 있다.
각 화분은 초기에 KK만큼의 수분을 머금고 있고, 매일 아래와 같은 일이 순서대로 일어난다.

  1. 랑이 집사가 연속된 AA개의 화분에 물을 준다. 이 때 물을 준 화분의 수분은 BB만큼씩 증가한다.
  2. 모든 화분의 수분이 1씩 감소한다.
  3. 수분이 0이 된 화분에 있는 캣닢은 죽는다.

모든 캣닢이 살아 있는 기간이 최대한 길어지도록 물을 줄 때, 첫 캣닢이 죽는 날짜를 출력하는 프로그램을 작성하시오. 첫 날은 1일이다.

입력 조건

  • 첫째 줄에 자연수 NN, KK, AA, BB가 공백을 사이에 두고 주어진다.
    (2N1002 \le N \le 100, 1K1001 \le K \le 100, 1A×B<N1 \le A \times B <N, AANN의 약수)

출력 조건

  • 모든 캣닢이 살아 있는 기간이 최대한 길어지도록 물을 줄 때, 첫 캣닢이 죽는 날짜를 출력한다.

예제 입력

inputoutput
6 3 2 25
2 2 1 13

🤔생각 정리

  1. 화분의 수분 정보를 담고 있는 리스트를 생성해야겠네.
  2. 연속된 AA개의 화분에 물을 주면서 수분의 값이 달라지겠네.
    • 물을 준 화분의 수분: + b - 1
    • 물을 안 준 화분의 수분: - 1
  3. 모든 캣닢이 살아 있는 기간이 최대가 되어야 하니까 연속된 날 동안 물을 주는 화분이 없도록 해야겠네.
  4. 물을 주는 화분의 인덱스를 잘 계산해야겠네.

💡Pseudo Code💡

1. k의 수분을 담은 n개의 화분 리스트 생성
2. while 수분이 0인 화분이 없을 때까지:
3.		day += 1
4. 		start_index = end_index(마지막에 물을 준 화분)
5. 		end_index = end_index + a
6. 		for p in pot:
7.			물을 준 화분의 수분 += (b-1) - 인덱스 내의 화분
8.			물을 안 준 화분의 수분 -= 1
9. return day

🖥️코드화

# 입력
n, k, a, b = map(int, input().split())
pot = [k] * n
e, cnt = 0, 0
while 0 not in pot:
    cnt += 1
    s, e = e, e+a
    idx = [i%n for i in range(s,e)] # 물을 줄 화분 인덱스
    pot = [p+b-1 if i%n in idx else p-1 for i, p in enumerate(pot)] # 수분 갱신

# 출력
print(cnt)

📌코드 비교 및 감상

  • 수식화 하여 반복없이 계산한다.
    (생각해보기는 했지만 계산하기 귀찮아서 안했는데 이렇게 구하면 진짜 시간복잡도는 못이기겠다.)
    코드를 인용하자면 이렇다.
# 입력 
N,K,A,B = map(int,input().split())

a=0
while-~a*N//A<=K+a*B:
	a+=1

#출력
print(K+a*B)
profile
데이터를 만지는 사람

0개의 댓글

관련 채용 정보