코테/JAVA

[백준 4796 / JAVA] 캠핑

쇼티드 2024. 1. 16. 17:02
728x90
반응형

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

 

4796번: 캠핑

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

www.acmicpc.net

 

Case 1

20일의 휴가 동안 연속하는 8일 중 5일만 사용할 수 있다.

즉, 5일 사용가능 + 3일 사용불가능 + 5일 사용가능 + 3일 사용 불가능 + 남은 일수(20 - 5 - 3 - 5 - 3 = 4) = 20일이다.

 

Case 2

17일의 휴가 동안 연속하는 8일 중 5일만 사용할 수 있다.

즉, 5일 사용가능 + 3일 사용불가능 + 5일 사용가능 + 3일 사용 불가능 + 남은 일수(17 - 5 - 3 - 5 - 3 = 1) = 17일이다.

 

여기서 조심하야할 것은 남은 일 수를 무조건 더하는 것이 아니다. 만약 남은 일 수가 연속에서 사용할 수 있는 일(P)보다 크면 P를 대신 더해줘야 한다.

예를 들어 어떤 케이스에서 남은 일수가 6일이고 P가 5일이라고 하자 어차피 5일 밖에 사용하지 못한다.

 

 

전체 코드

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

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String input;
        int L, P, V;
        int cnt = 0;

        while (true) {
            cnt++;
            input = br.readLine();
            StringTokenizer st = new StringTokenizer(input);
            L = Integer.parseInt(st.nextToken());
            P = Integer.parseInt(st.nextToken());
            V = Integer.parseInt(st.nextToken());
            if ((L == 0 && P == 0 && V == 0))
                return;
            System.out.println("Case " + cnt + ": " + (L * (V / P) + Math.min(V % P, L)));
        }
    }
}

위에서 설명한 경우를 하나의 식으로 표현했다.

V에서 P를 나눈 값이 뺄 수 있는 횟수이므로 그 횟수만큼 L을 곱한다.

그 후 남은 일수와 L 중 작은 수를 더해준다.

 

풀어쓴 코드

public static int sol(int L, int P, int V) {
        int result = 0;
        while (V >= P) {
            V -= P;
            result += L;
        }
        if (V < L)
            result += V;
        else
            result += L;
        return result;
    }

식을 풀어쓴 코드이다. V가 P보다 크거나 같으면 L을 결과값에 더해준다.

만약 작아진다면 V와 L을 비교해 더 작은 수를 더해준다.

 

728x90
반응형