작성일 :

문제 링크

29991번 - Fatigue-Fighting Vacation

설명

피로도가 충분하면 피로 활동을, 아니면 회복 활동을 수행하는 규칙에 따라 가능한 활동 수를 계산하는 문제입니다.


접근법

피로 활동과 회복 활동은 각각 순서가 고정되어 있으므로 두 인덱스를 관리하며 시뮬레이션합니다.

이후 피로도가 부족한 순간에 회복 활동이 남아 있지 않으면 종료하고, 수행한 활동 수를 출력합니다.


Code

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
32
33
34
using System;

class Program {
  static void Main() {
    var data = Console.In.ReadToEnd();
    var parts = data.Split();
    var idx = 0;

    var d = int.Parse(parts[idx++]);
    var c = int.Parse(parts[idx++]);
    var r = int.Parse(parts[idx++]);

    var tired = new int[c];
    var rest = new int[r];
    for (var i = 0; i < c; i++) tired[i] = int.Parse(parts[idx++]);
    for (var i = 0; i < r; i++) rest[i] = int.Parse(parts[idx++]);

    var iT = 0;
    var iR = 0;
    var done = 0;

    while (true) {
      if (iT < c && d >= tired[iT]) {
        d -= tired[iT++];
        done++;
      } else if (iR < r) {
        d += rest[iR++];
        done++;
      } else break;
    }

    Console.WriteLine(done);
  }
}

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
#include <bits/stdc++.h>
using namespace std;

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);

  int d, c, r; cin >> d >> c >> r;
  vector<int> tired(c), rest(r);
  for (int i = 0; i < c; i++)
    cin >> tired[i];
  for (int i = 0; i < r; i++)
    cin >> rest[i];

  int iT = 0, iR = 0, done = 0;
  while (true) {
    if (iT < c && d >= tired[iT]) {
      d -= tired[iT++];
      done++;
    } else if (iR < r) {
      d += rest[iR++];
      done++;
    } else break;
  }

  cout << done << "\n";

  return 0;
}