문제풀이/백준oj

[백준OJ] 4796번 캠핑

Hyeon-Uk 2021. 7. 3. 23:37
반응형

https://www.acmicpc.net/problem/4796

 

4796번: 캠핑

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있고, L, P, V를 순서대로 포함하고 있다. 모든 입력 정수는 int범위이다. 마지막 줄에는 0이 3개 주어진다.

www.acmicpc.net


 

-풀이-

문제에 나온 예시를 먼저 보자.

20일동안 연속되는 날중 10일만 사용할 수 있고, 방금 28일 휴가를 떠났을때 최대 사용가능한 날을 구해보자.

1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30
31 32 33 34 35 36 37 38 39 40

파란색이 이용가능한 날이고, 빨간색은 이용이 불가능한 날이다. 따라서 최대 18일을 이용할 수 있다는것이다.

 

하나하나 살펴보자.

처음 1일~20일중 강산이는 연속되는날중 10일을 사용할 수 있다. 따라서 1~20중 연속되는 10일을 사용가능하다.

다음 21~40일중 강산이는 연속되는 날 중 10일을 사용 할 수 있다. 하지만 강산이는 28일날까지 휴가이므로, 강산이가 최대로 사용을 하기 위해선, 21~30까지 캠핑장을 사용해야, 21~28일까지 총 8일을 더 이용할 수 있게된다.

따라서 최대 18일동안 이용이 가능하다.

 

8일동안 연속되는 날 중 5일만 사용할 수 있고, 방금 20일의 휴가를 떠났을때의 경우를 구해보자.

1 2 3 4 5 6 7 8
9 10 11 12 13 14 15 16
17 18 19 20 21 22 23 24

위와같이 따져보자.

처음 1~8일중 강산이는 최대 5일을 사용할 수 있다.

9~16중 강산이는 최대 5일을 사용할 수 있다.

17~24중 강산이는 총 5일을 사용할 수 있다. 하지만 강산이는 20일까지 휴가이므로, 17~21동안 사용을 한다고 해야 최대 4일을 사용할 수 있다.

따라서 강산이는 총 14일을 사용할 수 있게된다.

 

규칙이 보이는가?

캠핑장을 연속하는 P일 중, L일동안만 사용할 수 있다. 강산이는 이제 막 V일짜리 휴가를 시작했다. 라고할때

V/P 만큼의 묶음은 최대 L일을 모두 사용할 수 있다.

나머지 날짜인 V%P 일동안 최대 사용할 수 있는 날은, V%P가 L일보다 작다면, 남은 날짜인 V%P일이 최대가 되는것이고, V%P가 L일보다 크다면, 최대 L일 사용할 수 있게되는것이다.

 

-시간복잡도-

단순 계산식이므로, 테스트케이스가 T개라고 한다면 O(T)가 된다.

 

-코드-

#include <iostream>
#include<algorithm>
#include<vector>
using namespace std;

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	int l, p, v;
	int n = 1;
	while (true) {
		cin >> l >> p >> v;
		if (!l && !p && !v) {
			break;
		}

		int result = (v / p)*l;
		v %= p;
		result += (l < v ? l : v);
		cout << "Case " << n << ": " << result << "\n";
		n++;
	}
}
반응형