복대가리의 개발

[C#] 백준 (알고리즘)/브론즈 문제

[백준 - C#] 4796번 캠핑

복대가리 2022. 8. 8. 23:49
728x90

문제링크

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

 

4796번: 캠핑

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

www.acmicpc.net

 

문제

등산가 김강산은 가족들과 함께 캠핑을 떠났다. 하지만, 캠핑장에는 다음과 같은 경고문이 쓰여 있었다.
캠핑장은 연속하는 20일 중 10일동안만 사용할 수 있습니다.
강산이는 이제 막 28일 휴가를 시작했다. 이번 휴가 기간 동안 강산이는 캠핑장을 며칠동안 사용할 수 있을까?
강산이는 조금 더 일반화해서 문제를 풀려고 한다. 
캠핑장을 연속하는 P일 중, L일동안만 사용할 수 있다. 강산이는 이제 막 V일짜리 휴가를 시작했다.
강산이가 캠핑장을 최대 며칠동안 사용할 수 있을까? (1 < L < P < V)

조건

시간제한 : 1초
메모리 제한 : 128 MB

입력

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

출력

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

 

문제정리

1. 캠핑장을 연속하는 P일중 L일동안만 사용 가능
2. 휴가는 총 V일이다.
3. 캠핑장을 최대 몇일 사용할 수 있을까?

이번 문제의 경우 총 휴가 날짜가 정해지고 캠핑장을 최대로 사용할 수 있는 날짜를 구하는 문제입니다.

문제 풀이함에 있어 중요한 것은 연속하는 P일 중 L일 동안만 사용가능 하다는 것입니다.

총 휴가 일에 연속사용 가능 한 일을 나누고 사용 가능한 일을 곱해주면 무조건 쓸 수 있는 휴가 일수가 나옵니다.

그리고 총 휴가에 P일을 나눈 나머지를 구하게 되면 총 사용하고 남은 일수가 나옵니다.

 

무조건 사용 가능한 휴가 일 = (V / P) * L

사용하고 남은 휴가 = V % P

 

사용하고 남은 수의 경우 L일을 초과할 수 없기 때문에 남은 일수가 L 보다 크다면 L만큼 휴가를 쓸 수 있고 적다면 남은 수만큼만 사용하면 됩니다.

(V < L ) ? V : L

 

더 자세한 내용은 아래 코드에서 확인 해볼 수 있습니다.

C# 코드

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
static void Main(string[] args)
{
    StreamWriter writer = new StreamWriter(Console.OpenStandardOutput());
    StreamReader reader = new StreamReader(Console.OpenStandardInput());
 
    int index = 0;
 
    while (true)
    {
        int sum = 0;
        string[] input = reader.ReadLine().Split();
 
        int L = int.Parse(input[0]); // P 기간 중 사용할 수 있는 기간
        int P = int.Parse(input[1]); // 캠핑장을 연속하는 기간
        int V = int.Parse(input[2]); // 휴가 기간
 
        if (L == 0 && P == 0 && V == 0)
            break;

// V일 자리 휴가에 연속하는 기간 P로 나눈 몫에 L을 곱하면 반드시 써야하는 휴가 기간입니다.
        sum = (V / P) * L; 
// V일에 휴가기간에서 연속하는 기간을 나눈 나머지는 사용하지 못한 휴가 입니다.
        V %= P; 
// 남은 휴가가 L 보다 작다면 그대로 사용하면 되고 크다면 L만큼 밖에 사용하지 못합니다.
        sum += V < L ? V : L; 
        index++;
 
        writer.WriteLine($"Case {index}: {sum}");
    }
 
    writer.Close();
    reader.Close();
}
cs

읽어주셔서 감사합니다 오늘도 즐거운 하루 되세요.

 

728x90