작성일 :

문제 링크

22388번 - 改元

설명

평성(HEISEI) 표기 날짜를 새 원호 시작일 기준으로 변환하는 문제입니다.

평성은 31년 4월 30일까지이며, 31년 5월 1일부터는 새 원호의 1년 5월 1일로 시작합니다.


접근법

평성 31년 4월 30일을 경계로 판별합니다. 경계 이하면 그대로 HEISEI와 연월일을 출력합니다.

경계를 넘으면 평성 연도를 그레고리력 연도로 변환합니다. 평성 1년이 1989년이므로 1988에 평성 연도를 더하면 그레고리력 연도가 됩니다. 새 원호는 2019년부터 시작하므로 그레고리력 연도에서 2018을 빼면 새 원호의 연도가 됩니다. 월과 일은 그대로 사용합니다.


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

class Program {
  static void Main() {
    while (true) {
      var line = Console.ReadLine();
      if (line == null || line.Trim() == "#") break;

      var parts = line.Split();
      var y = int.Parse(parts[1]);
      var m = int.Parse(parts[2]);
      var d = int.Parse(parts[3]);

      var heisei = y < 31 || (y == 31 && (m < 5 || (m == 4 && d <= 30)));
      if (heisei) Console.WriteLine($"HEISEI {y} {m} {d}");
      else {
        var gy = 1988 + y;
        var newYear = gy - 2018;
        Console.WriteLine($"? {newYear} {m} {d}");
      }
    }
  }
}

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

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

  string g;
  while (cin >> g) {
    if (g == "#") break;

    int y, m, d; cin >> y >> m >> d;

    bool heisei = (y < 31) || (y == 31 && (m < 5 || (m == 4 && d <= 30)));
    if (heisei) cout << "HEISEI " << y << " " << m << " " << d << "\n";
    else {
      int gy = 1988 + y;
      int newYear = gy - 2018;
      cout << "? " << newYear << " " << m << " " << d << "\n";
    }
  }

  return 0;
}