[BOJ]4796号:キャンプ


✔10.質問する


登山家の金剛山さんは家族と一緒にキャンプに行きました.しかし、キャンプ場には以下の警告文が書かれている.
キャンプ場は20日間連続で10日間しか利用できません.
江山は28日間の休暇を取ったばかりだ.今度の休暇期間中、江山のキャンプ場は何日間使えますか?
江山はもう少し普通に問題を解きたいと思っている.
キャンプが続くP日の中で、L日しか使えません.江山さんはまだV休暇を取ったばかりだ.江山は最大何日キャンプ場を露出することができますか?(1 < L < P < V)
[入力]
入力は、複数のテスト・インスタンスから構成されます.各試験箱は、L、P、Vの順に1行で構成されている.すべての入力整数はint範囲です.最後の行は3つのゼロを与えます.
[出力]
試験箱ごとに、江山はキャンプ場を最大数日の出力をサンプル出力として使用することができる.

😎 ソースコード

day = 0
answer = []

while True:
	L, P, V = map(int, input().split())
	
	if L == 0 and P == 0 and V == 0:
		# 입력 종료
		break
	else:
		afterCycle = V % P
		if L < afterCycle:
			day += L
		else:
			day += afterCycle
		cycle = V // P
		day += cycle * L
		
		# answer에 캠핑 가능한 날짜를 넣어줌
		answer.append(day)
		day = 0

for i in range(len(answer)):
	print(f'Case {i+1}: {answer[i]}')

問題が終わったら


文字を読むのは適切ではないので、絵を描いて、問題を理解しました.

絵を描いた後、どうやって解くかやっと分かったので、すぐにコードを書きました.総休暇期間(V)では、連続するP日を除き、残りの日数(これらの日付をafterCycleとする)とP日を何回(これをcycleという)することができ、確認すればよい.
注目すべきは、afterCycleがキャンプ使用日(L)より大きいことです.最初は思いもよらなかったが、2 8 20を入力したとき、正解は6だったが、私の出力は8だったので、何が間違っているのか悩んでいた.