작성일 :

문제 링크

4796번 - 캠핑

설명

일정한 주기로만 캠핑장을 사용할 수 있을 때, 휴가 기간 동안 최대 며칠을 사용할 수 있는지를 구하는 문제입니다.


휴가 일수 V일이 주어지고, 캠핑장은 매 P일 중 L일만 사용할 수 있다는 조건이 있습니다.


강산이는 캠핑장을 규칙적으로 사용할 수 있다고 가정하고,

V일의 휴가 기간 동안 최대 며칠간 캠핑장을 사용할 수 있는지를 계산하려 합니다.


접근법

이 문제는 V일을 P일 단위로 나누어 처리하는 그리디 반복 구조로 해결할 수 있습니다.

  1. 휴가 일수 VP일 단위로 나누면,
    • V // P만큼은 L일씩 사용할 수 있습니다.
    • 남은 일수 V % P에 대해서는 L일을 넘지 않는 선에서 추가로 사용할 수 있습니다.
  2. 따라서 최종 사용 가능한 일수는 다음과 같이 계산됩니다:
\[(V \div P) \times L + \min(L, V \bmod P)\]


이 계산을 매 테스트 케이스마다 반복하여, "Case x: 정답" 형식으로 출력합니다.


참고 : 그리디 알고리듬(Greedy Algorithm, 탐욕법)의 원리와 적용 - soo:bak



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;
}