Official

A - When? Editorial by KoD


答えの時刻を求める

答えの時刻が \(H\)\(M\) 分であるとします。

\(0 \leq X \leq 100\) より、\(X \lt 60\) ならば \(H = 21\) であり、\(X \geq 60\) ならば \(H = 22\) です。また、\(M\)\(X\)\(60\) で割った余りに等しいです。

答えを出力する

時間または分が \(1\) 桁の場合、先頭に \(0\) を追加して \(2\) 桁として出力しなければなりません。これをどのように実装すればよいかを C++ / Python のそれぞれについて説明します。

C++ での実装例

1. 自前の関数を定義する

整数を引数として渡すと、必要に応じて \(0\) を埋めて長さ \(2\) の文字列にして返すような関数を定義すればよいです。

#include <iostream>
#include <string>
using namespace std;

string fix(int x) {
  if (x < 10) {
    return string{'0'} + to_string(x);
  } else {
    return to_string(x);
  }
}

int main() {
  int X;
  cin >> X;
  int H = X < 60 ? 21 : 22;
  int M = X % 60;
  cout << H << ':' << fix(M) << '\n';
}
2. std::setfillstd:::setw を使う

これらの関数を用いることで、出力の幅を指定したり、その際に埋める文字を指定したりすることができます。

#include <iostream>
#include <iomanip>
using namespace std;

int main() {
  int X;
  cin >> X;
  int H = X < 60 ? 21 : 22;
  int M = X % 60;
  cout << H << ':' << setw(2) << setfill('0') << M << '\n';
  return 0;
}
3. std::printf を使う

この問題では std::cout ではなく std::printf を用いた方が簡潔に書くことができます。C++20 からは std::format が導入され、高機能な書式設定が標準で利用できるようになります。

#include <iostream>
#include <cstdio>
using namespace std;

int main() {
  int X;
  cin >> X;
  int H = X < 60 ? 21 : 22;
  int M = X % 60;
  printf("%d:%02d", H, M);
  return 0;
}

Python での実装例

str.format() を用いる

format メソッドによって文字列の高機能な書式設定が可能です。\(0\) 埋めなどの処理も簡潔に書くことができます。

x = int(input())
h = 21 if x < 60 else 22;
m = x % 60
print('{}:{:02}'.format(h, m))
datetime を用いる

標準の日時処理ライブラリ datetime を用いると、日付や時刻の計算や出力を行うことができます。

from datetime import datetime, timedelta
begin = datetime(2022, 7, 2, hour=21)
delta = timedelta(minutes=int(input()))
answer = begin + delta
print(answer.strftime('%H:%M'))

posted:
last update: