캠핑장을 연속하는 P일 중, L일동안만 사용할 수 있다.
강산이는 이제 막 V일짜리 휴가를 시작했다.
강산이가 캠핑장을 최대 며칠동안 사용할 수 있을까?
(1 < L < P < V)
핵심 키워드들이다.
처음 방식(틀린 방식)
V일짜리 휴가에, 연속한 P일 중,
L일동안 사용가능하므로
v일에 얼마나 P일이 들어있나를 조사했다.
-> v / p
p일엔 L일만큼만 사용가능하므로
-> v / p * L
v를 P로 나눈 나머지를 더하면 답이 나오니
-> 답: v / p * L + v % p
하지만 이렇게 풀었더니 틀렸다.
왜일까 고민하고 찾아봤다.
반례로는, 111일을 휴가로 받았는데
캠핑장에선 20일 중 9일을 사용가능하다고 할 때
위 풀이대로 하면
111 / 20 * 9 + 111 % 20
->45 + 11이 나온다.
하지만 정답은 111 / 20 * 9+ 9이다.
따라서,
두번째 방식
v / p * L 까진 맞으나
v % p와 L을 비교해야 한다.
#include<iostream> //예를들어 111일 휴가 받았고, 20일중 9일 만 된다 싶을때
//원래 답은 111/20 *9 + 9지만,V%P로 해버리면 111/20+ 11이 되어버린다.
using namespace std;
void solution(const int& L, const int& P, const int& V) { //각 L,P,V에 대해 답 구하고 출력 함수
static int cnt = 1,ans=0; //static으로 선언하여 반복호출때마다 cnt값 증가할수 있게.
if (V % P > L) ans =(( V / P )* L) + L; //만약 V%P>L 일땐 V%P말고 L을 더해줌
else
ans = V / P * L + V % P; //V%P<=L이면 L말고 V%P 더해준다.
cout << "Case " << cnt << ": " << ans << '\n';
cnt++;
}
void input(int& L, int& P, int& V) { //P일 중 L일만큼 휴가를 사용가능, V일짜리 휴가 받음
while (1) {
cin >> L >> P >> V;
if (L == 0 && P == 0 && V == 0) return;
solution(L, P, V);
}
}
int main() {
int L = 0, P = 0, V = 0;
input(L, P, V);
}
더 생각안하고 V%P 를 그냥 더하고 제출한게 좀 아쉽다.
L과 비교했었어야 했는데,
L과 비굘했어야지!!!! 참나!