[C++] 백준 온라인 저지 4796번 캠핑 풀이
강산이가 캠핑장에서 최대로 머무를 수 있는 일수를 구하는 문제
https://www.acmicpc.net/problem/4796
4796번: 캠핑
입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있고, L, P, V를 순서대로 포함하고 있다. 모든 입력 정수는 int범위이다. 마지막 줄에는 0이 3개 주어진다.
www.acmicpc.net
문제의 조건
1. 강산이가 간 캠핑장은 연속된 P일 중에 L일만 머무를 수 있다. 20일 중에 10일만 머무를 수 있거나 8일 중에 5일만 머무를 수 있거나...
2. 강산이는 이제 막 V일짜리 휴가를 시작했다. 28일짜리 휴가를 시작했거나 15일짜리 휴가를 시작했거나...
3. 여러 테스트 케이스가 5(L) 8(P) 20(V) 와 같은 형태로 순서대로 주어질 때 강산이의 휴가기간 동안 캠핑장에 최대로 머물 수 있는 일수를 구해서
ex) Case 1: 14 와 같이 출력한다.
테스트 케이스의 마지막에는 0 0 0이 주어진다.
풀이 과정
웬일로 쉽게 풀렸는데 그 과정을 적어보자면
1. 연속된 8일 중에 5일만 머무를 수 있고 휴가가 20일이라면 16일 동안 최대 10일동안 머무를 수 있다.
2. 17일째가 되면 캠핑장 날짜가 리셋되니까 다시 5일동안 머무를 수 있는데 강산이의 휴가는 20일에 끝난다.
즉 17, 18, 19, 20 4일동안 머무를 수 있다.
3. 1번에서 구한 10과 2번에서 구한 4일을 더하면 14일이 된다.
4. 여기에서 휴가 일수를 연속된 P일로 나눈 몫을 L일에 곱하면 휴가 기간동안 무조건 머무를 수 있는 최소 일수를 구할 수 있다.
5. 마지막으로 휴가 일수를 P일로 나누고 남은 나머지 중에서 며칠동안 머무를 수 있는지 구해서 4번에 더해줘야 최종 답이 되는데,
L일보다 남은 휴가 일수가 길 수도 있고 짧을 수도 있다. 남은 휴가 일수가 L일보다 길다면 L일만큼만 더해주고 짧다면 남은 휴가 일수를 더해준다.
코드
#include <iostream>
using namespace std;
int main(int argc, const char * argv[])
{
int Case = 1;
while (true)
{
int limit, wholeDays, vacation;
cin >> limit >> wholeDays >> vacation;
if (0 == limit && 0 == wholeDays && 0 == vacation) break;
int possible = vacation / wholeDays;
int left = vacation % wholeDays; //휴가 일수를 연속된 P일로 나눈 나머지
int answer = possible * limit;
answer += min(left, limit); //나머지와 L일 중 작은 것을 더한다.
cout << "Case " << Case << ": " << answer << endl;
Case++;
}
return 0;
}
그리디를 한 번에 빨리 푸니까 좀 낯설다... 머선일