작성일 :

문제 링크

29734번 - 집에선 안돼잉

설명

집에서 과제를 할지, 독서실에서 과제를 할지 중 더 빠르게 제출할 수 있는 쪽을 판별하는 문제입니다.

과제를 수행하는 중에는 일정 시간마다 피로로 인해 수면이 필요합니다.

  • 8시간마다 1회 수면이 필요하며, 수면 시간은 S입니다.
  • 집에서는 곧바로 수면이 가능하지만, 독서실에서는 수면을 위해 집으로 왕복 이동 시간(2 * T)이 추가로 발생합니다.


즉, 과제를 수행하는 시간 외에도 수면 주기와 이동 시간을 반영해야 하며,
집과 독서실 각각에서의 전체 수행 시간을 계산하여 더 짧은 쪽을 선택합니다.


접근법

집에서 수행할 경우

  • 과제를 수행하는 데 걸리는 총 시간은 N입니다.
  • 8시간마다 한 번씩 수면이 필요하므로, 수면 횟수는 다음과 같이 계산됩니다:
\[\text{sleepCount}_{\text{집}} = \left\lfloor \frac{N - 1}{8} \right\rfloor\]
  • 따라서 집에서의 전체 소요 시간은 다음과 같습니다:
\[Z = N + \text{sleepCount}_{\text{집}} \times S\]


독서실에서 수행할 경우

  • 독서실로 이동하는 시간 T가 필요하며, 과제 수행 시간은 M입니다.
  • 수면은 집에서만 가능하므로, 수면마다 왕복 이동 시간 2*T + 수면 시간 S가 추가됩니다.
\[\text{sleepCount}_{\text{독서실}} = \left\lfloor \frac{M - 1}{8} \right\rfloor\]
  • 독서실에서의 전체 소요 시간은 다음과 같습니다:
\[D = T + M + \text{sleepCount}_{\text{독서실}} \times (2T + S)\]


최종 판단

  • ZD 중 더 작은 값을 선택합니다.
  • 집이 더 빠르면 "Zip"을, 독서실이 더 빠르면 "Dok"을 출력하고,
    두 번째 줄에 해당 소요 시간을 함께 출력합니다.

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
using System;

class Program {
  static void Main() {
    var tokens = Console.ReadLine().Split();
    long n = long.Parse(tokens[0]);
    long m = long.Parse(tokens[1]);

    tokens = Console.ReadLine().Split();
    long t = long.Parse(tokens[0]);
    long s = long.Parse(tokens[1]);

    long homeSleep = (n - 1) / 8;
    long dormSleep = (m - 1) / 8;

    long z = n + homeSleep * s;
    long d = t + m + dormSleep * (2 * t + s);

    if (z < d) {
      Console.WriteLine("Zip");
      Console.WriteLine(z);
    } else {
      Console.WriteLine("Dok");
      Console.WriteLine(d);
    }
  }
}

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

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

  ll n, m, t, s; cin >> n >> m >> t >> s;

  ll z = n + (n - 1) / 8 * s;
  ll d = t + m + (m - 1) / 8 * (2 * t + s);

  if (z < d) cout << "Zip\n" << z;
  else cout << "Dok\n" << d;

  return 0;
}