백준 4796(캠핑)

jh Seo·2022년 6월 21일
1

백준

목록 보기
8/180

개요

[링크]백준 4796번: 캠핑

캠핑장을 연속하는 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과 비교했었어야 했는데,

profile
코딩 창고!

1개의 댓글

comment-user-thumbnail
2022년 6월 22일

L과 비굘했어야지!!!! 참나!

답글 달기