문제 풀이 및 개발 공간

[백준] 4796번 캠핑 문제! (silver 5 본문

백준공부/java

[백준] 4796번 캠핑 문제! (silver 5

gomduri43 2022. 7. 17. 18:37

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

public class Main {

	public static void main(String[] args) throws IOException  {
		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out));
		int num=1;
		while(true) {
			StringTokenizer st=new StringTokenizer(br.readLine());
			int posDay=Integer.parseInt(st.nextToken());//사용가능 l날
			int conDay=Integer.parseInt(st.nextToken());//연속하는 p날
			int vacaDay=Integer.parseInt(st.nextToken());//연속하는 휴가v날

			if(posDay + conDay + vacaDay==0 ) {
				break; //이중 반복문이 아니므로 break;로 탈출
			}
			if(vacaDay%conDay > posDay) {
				int result=vacaDay/conDay*posDay+ posDay;
				bw.write("Case "+num+": "+result+"\n");
				bw.flush();
				num++;
			}
			else{
				int result=vacaDay/conDay*posDay+ vacaDay%conDay;
				bw.write("Case "+num+": "+result+"\n");
				bw.flush();
				num++;
			}
		}
	}
}

//오류가 났었던 이유, 휴가날에서 p날을 나누면 p가 몇번 반복되는지 나오고 
//p의 반복횟수는 결구 사용가능한 날이 몇번 반복되는지이다. 따라서 그렇게 나눈뒤, posDay를 곱해
//이용가능날이 몇번 돌아오는지 구하고, 나머지 값은 다 더했다. 예제에서는 문제가 없었지만,
//5 40 60과 같이 40일에 5일만 쓸 수있는 경우에는 오류가 발생한다. 왜냐하면, 
// 60/40을 하면, 몫이 1이므로 일단 5일이 사용가능하고, 나머지 20일에 대해서 다 이용가능 한것으로
//더해지기 때문이다. 실제로는 20일중에서도 5일만 사용이 가능한 것인데 말이다.,
//따라서 그러한 경우를 분리해서 계산해야 한다.