[백준 4796] 캠핑 (C++, C#) - soo:bak
작성일 :
문제 링크
설명
일정한 주기로만 캠핑장을 사용할 수 있을 때, 휴가 기간 동안 최대 며칠을 사용할 수 있는지를 구하는 문제입니다.
휴가 일수 V
일이 주어지고, 캠핑장은 매 P
일 중 L
일만 사용할 수 있다는 조건이 있습니다.
강산이는 캠핑장을 규칙적으로 사용할 수 있다고 가정하고,
V
일의 휴가 기간 동안 최대 며칠간 캠핑장을 사용할 수 있는지를 계산하려 합니다.
접근법
이 문제는 V
일을 P
일 단위로 나누어 처리하는 그리디 반복 구조로 해결할 수 있습니다.
- 휴가 일수
V
를P
일 단위로 나누면,
V // P
만큼은L
일씩 사용할 수 있습니다.- 남은 일수
V % P
에 대해서는L
일을 넘지 않는 선에서 추가로 사용할 수 있습니다.
- 따라서 최종 사용 가능한 일수는 다음과 같이 계산됩니다:
이 계산을 매 테스트 케이스마다 반복하여, "Case x: 정답"
형식으로 출력합니다.
Code
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
using System;
class Program {
static void Main() {
int caseNum = 0;
while (true) {
var input = Console.ReadLine().Split();
int L = int.Parse(input[0]);
int P = int.Parse(input[1]);
int V = int.Parse(input[2]);
if (L == 0 && P == 0 && V == 0) break;
int full = V / P;
int remain = V % P;
int days = full * L + Math.Min(remain, L);
Console.WriteLine($"Case {++caseNum}: {days}");
}
}
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t = 0;
while (true) {
int avail, seq, vaca; cin >> avail >> seq >> vaca;
if (avail == 0 && seq == 0 && vaca == 0) break;
int ans = 0;
while (vaca >= seq) {
ans += avail;
vaca -= seq;
}
ans += min(avail, vaca);
cout << "Case " << ++t << ": " << ans << "\n";
}
return 0;
}