작성일 :

문제 링크

27161번 - 크레이지 타임

설명

각 카드에 대해 외쳐야 하는 시각과 손바닥을 쳐야 하는지를 출력하는 문제입니다.

시각은 1부터 시작해 방향에 따라 1씩 증감하며, 1~12 범위를 순환합니다.

모래시계 카드는 방향을 반전시키고, 카드 시각이 현재 시각과 같으면 손바닥을 칩니다.

단, 두 조건이 동시에 성립하면 과부하로 아무 규칙도 적용하지 않습니다.


접근법

현재 시각과 진행 방향을 유지하며 시뮬레이션합니다.

각 카드마다 모래시계인지, 시각이 일치하는지 확인합니다.

둘 다 해당하면 무시하고, 하나만 해당하면 해당 규칙을 적용합니다.

출력 후 방향에 따라 시각을 증가 또는 감소시키며, 12 다음은 1로, 1 이전은 12로 순환합니다.


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

class Program {
  static void Main() {
    var n = int.Parse(Console.ReadLine()!);
    var cur = 1;
    var dir = 1;

    for (var i = 0; i < n; i++) {
      var line = Console.ReadLine()!.Split();
      var kind = line[0];
      var x = int.Parse(line[1]);

      var hourglass = kind[0] == 'H';
      var sync = cur == x;

      var action = "NO";
      if (hourglass && sync) { }
      else if (hourglass) dir *= -1;
      else if (sync) action = "YES";

      Console.WriteLine($"{cur} {action}");

      cur += dir;
      if (cur == 13) cur = 1;
      if (cur == 0) cur = 12;
    }
  }
}

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

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

  int n;
  if (!(cin >> n)) return 0;
  int cur = 1;
  int dir = 1;

  for (int i = 0; i < n; i++) {
    string s; int x;
    cin >> s >> x;
    bool hourglass = (s[0] == 'H');
    bool sync = (cur == x);
    string action = "NO";

    if (hourglass && sync) { }
    else if (hourglass) dir *= -1;
    else if (sync) action = "YES";

    cout << cur << " " << action << "\n";

    cur += dir;
    if (cur == 13) cur = 1;
    if (cur == 0) cur = 12;
  }

  return 0;
}