Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

[백준] Greedy: 캠핑 본문

코테준비

[백준] Greedy: 캠핑

Seung__ 2022. 5. 28. 21:39

문제

등산가 김강산은 가족들과 함께 캠핑을 떠났다. 하지만, 캠핑장에는 다음과 같은 경고문이 쓰여 있었다.

캠핑장은 연속하는 20일 중 10일동안만 사용할 수 있습니다.

강산이는 이제 막 28일 휴가를 시작했다. 이번 휴가 기간 동안 강산이는 캠핑장을 며칠동안 사용할 수 있을까?

강산이는 조금 더 일반화해서 문제를 풀려고 한다. 

캠핑장을 연속하는 P일 중, L일동안만 사용할 수 있다. 강산이는 이제 막 V일짜리 휴가를 시작했다. 강산이가 캠핑장을 최대 며칠동안 사용할 수 있을까? (1 < L < P < V)

입력

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

출력

각 테스트 케이스에 대해서, 강산이가 캠핑장을 최대 며칠동안 사용할 수 있는지 예제 출력처럼 출력한다.

 

문제 접근.

문제 이해가 잘 안되었다. 

문제에 예시로 "연속하는 20일 중 10일동안 만 사용할 수 있다"고 나왔다.

이 뜻이 20일 중 10일만 사용이 가능한건지, 10일까지 사용이 가능한 것이지 구분이 안되었다.

 

이 상태로 아래 예시를 봤다.

아래 예시는 다음과 같음과 같은 뜻으로 이해되었다.

case1: 20일 내에서 연속 8일 2번 가능. 남은 4일 가능.   --> (20/8)*5+(20%8)

case1: 20일 내에서 연속 8일 2번 가능. 남은 1일 가능.   --> (20/8)*5+(20%8)

 

위에선 20일 중 10일 만 가능하다고 했는데...헷갈린다. 남은 일자는 모두 쓸 수 있는건가..말이 안맞는다..

 

예시에서 확인한 로직대로 작성해 보았따.

package baekjun;

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

public class _4796 {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int caseNumber = 1;
        while(true){
            String s = br.readLine();

            if (s.equals("0 0 0")) break;

            String[] caseString = s.split(" ");

            int[] each = new int[3];
            for (int i=0; i<3; i++){
                each[i] = Integer.parseInt(caseString[i]);
            }


            int answer = (each[2] / each[1])*each[0] + each[2]%each[1];
            System.out.println("Case "+caseNumber+": "+answer);
            caseNumber++;
        }

    }
}

 

진행 하다가 에러가 나는 것을 보니 문제의 의도는 "20일 중 10일까지 사용이 가능하다." 이다.

즉 이 말은 10일까지 사용이 가능한 경우는 20일이 확보되었을 경우이다.

대우로 20일이 확보되지 않으면 10일까지 사용을 못한다. --> 그럼 언제까지라는겨

 

그러면 남은 날짜와  문제에서 제시하는 L을 비교해야 한다.

 

예를들어 L = 1이고 P = 10, V=15라고 해보자. 극단적으로 L을 줄였다.

V/P = 1이고, 남는 일수는 5일이다. 

L이 1인데 남는 일수 5일 전부 사용이 가능할까??? 아니다.

 

위에서 사용한 조건 중 20일이 확보되지 않으면 10일 사용못한다는 내용이 있다.

 

이 경우에 대입해 보면 1일을 사용하기 위해서 10일이 확보되어야 한다.

 

남은 일수가 5일인데 이는 P보다 작다. 따라서 위  경우의 답은 (15/10)*1+1이다.

 

즉 남은 일수를 모두 사용하는 것이 아니라 남은일수&L 중 작은 수 만큼 사용이 가능하다.

 

풀이 코드

package baekjun;

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

public class _4796 {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int caseNumber = 1;
        while(true){
            String s = br.readLine();

            if (s.equals("0 0 0")) break;

            String[] caseString = s.split(" ");

            int[] each = new int[3];
            for (int i=0; i<3; i++){
                each[i] = Integer.parseInt(caseString[i]);
            }


            int answer = (each[2] / each[1])*each[0] + Math.min(each[0], each[2]%each[1]);
            System.out.println("Case "+caseNumber+": "+answer);
            caseNumber++;
        }

    }
}

'코테준비' 카테고리의 다른 글

[백준] Greedy: 기타줄  (0) 2022.05.30
[백준]Greedy: 보석도둑  (0) 2022.05.29
[백준] Greedy: A → B  (0) 2022.05.28
[백준] Greedy: 뒤집기  (0) 2022.05.28
[백준] Greedy: 단어수학  (0) 2022.05.27
Comments