알고리즘/백준

[파이썬, 자바] BOJ_4796(캠핑)

딱따구르리 2021. 1. 25. 11:37
728x90
반응형

문제

 

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

 

4796번: 캠핑

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

www.acmicpc.net


 

해설

 

문제를 접하고 처음 생각했을 땐,

대체 어떻게 테스트 케이스가 5, 8, 20인데 답이 14가 나오는지 이해가 안됐었다.

강산이의 휴가 기간이 20일이라 8일이 연속되는 날은 2번 밖에 없다고 생각했기 때문이었다.

이게 아니고 한달(30 혹은 31일) 중 8일이 연속되기만 하면 되는거였다.

 

이제 다시 풀려고 보면 쉬운 문제였다.

 

테스트 케이스 5, 8, 20을 생각해보면

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

이렇게 20일을 연속되는 8일로 구분지어 볼 수 있다.

8일이 완전히 있는 날 들은 2번이 있고, 그 2번은 5일을 사용할 수 있다.

 

그러나 뒤의 회색으로 표시된 날은 4일밖에 남지 않았다. 

그럼 총 (5 * 2) + 4일을 사용할 수 있다는 것이 된다.

 

회색으로 남은 날과 캠핑장 사용 가능한 날(L)을 비교했을 때, 

L이 남은 날보다 더 적은 날이 있을 수 있고, 큰 날이 있을 수 있다.

이걸 경우에 따라 나눠줄 수도 있겠지만 그건 너무 비효율적이다.

어차피 L과 남은 날 중 더 적은 날 만큼만 사용할 수 있기 때문에 그냥 min()을 통해 적은 날을 찾아 더해주면 된다.

 


코드

 

-파이썬

#백준 4796(캠핑)

case = 0  #테스트 케이스 개수
while True:
    l, p, v = map(int, input().split())  # 캠핑 사용 날짜, 연속 날짜, 휴가 기간
    sum = 0  #캠핑장 사용 가능 최대 일수

    if l == 0 and p == 0 and v == 0:
        break
    else:
        sum = (v // p) * l  #완전히 사용 가능한 기간
        sum += min((v % p), l)  #남은 날 중 사용 가능한 기간
        case += 1
        print("Case %d: %d" %(case, sum))

 

-자바

//백준 4796(캠핑)
import java.util.*;
import java.io.*;

public class Boj_4796 {

	public static void main(String[] args) throws IOException{
		Scanner sc = new Scanner(System.in);
		int test = 0;
		
		while(true) {
			int l = sc.nextInt();  //캠핑 사용 날짜
			int p = sc.nextInt();  //연속 날짜
			int v = sc.nextInt();  //휴가 기간
			int sum = 0;  //캠핑장 사용 가능 최대 일수
			
			if(l == 0 && p == 0 && v == 0) {
				break;
			}
			else {
				sum = (v / p) * l;
				sum += Math.min((v % p), l);
				test += 1;
				System.out.println("Case " + test + ": "+ sum);
			}
		}

	}

}
728x90
반응형