勤怠の記録から残業と深夜の時間を出す

  • 条件分岐
  • 問題 19
  • ふつう
  • 目安 31 分

出勤と退勤の時刻と休憩の分数が並んだ勤怠の記録から、残業の合計と深夜の勤務の合計を分で出す。日をまたぐ勤務と、時間帯の重なりを場合分けで数える練習です。

本番の試験は PC で受けることが多いので、PC での練習をすすめます。スマホでも、読んで、書いて、採点するところまで動きます。

入力は標準入力から読み、答えは標準出力に書きます。1 テストあたり 3 秒までです。

問題

ある職場の勤怠の記録が N 件あります。1 件は 1 回の勤務で、出勤の時刻、退勤の時刻、休憩の分数 B からなります。時刻は HH:MM の形 (24 時間制。時と分はどちらも 2 桁で、07:05 のように 0 を補って書く) です。次の決まりで、残業の合計と深夜の勤務の合計を、どちらも分で求めてください。

  • 退勤の時刻が出勤の時刻より前のときは、日をまたいで、出勤の翌日のその時刻に退勤したものとします。出勤と退勤が同じ時刻の記録はありません。どの勤務も 24 時間より短くなります
  • 出勤から退勤までの分数を勤務の長さ、勤務の長さから休憩 B を引いた分数を実働と呼びます
  • 実働が 8 時間 (480 分) を越えたとき、越えた分がその勤務の残業です。越えなければ、その勤務の残業は 0 分です
  • 毎日 22 時から翌朝 5 時までを深夜の時間帯とします (0 時から 5 時までと、22 時から 24 時までです)。22 時 0 分ちょうどからの 1 分は深夜に入り、5 時 0 分ちょうどからの 1 分は深夜に入りません。出勤から退勤までのうち、深夜の時間帯に入る分数が、その勤務の深夜の勤務分です
  • 休憩は、深夜の時間帯の外でとったものとします。深夜の勤務分から休憩は引きません

入力の形式

N
S_1 E_1 B_1
S_2 E_2 B_2
...
S_N E_N B_N

1 行目に記録の数 N、続く N 行に、1 行に 1 件の記録が並びます。S_i は出勤の時刻、E_i は退勤の時刻、B_i は休憩の分数で、半角の空白 1 つで区切られています。

出力の形式

2 行を出力します。1 行目に N 件の残業の合計 (分)、2 行目に N 件の深夜の勤務分の合計 (分) を、整数で書きます。

制約

  • N は 1 以上 100000 以下の整数です
  • S_i と E_i は 00:00 以上 23:59 以下の時刻で、S_i と E_i は違う時刻です
  • B_i は 0 以上の整数で、その勤務の長さから深夜の勤務分を引いた値以下です (休憩は深夜の外でとれる長さに収まります)

入力と出力の例

例 1

1 件目は 9 時から 18 時までで休憩 60 分、実働はちょうど 480 分なので残業は 0 分です。2 件目は 9 時から 22 時 30 分まで、勤務の長さ 810 分から休憩 60 分を引いた実働 750 分のうち 270 分が残業で、22 時からの 30 分が深夜です。3 件目は 22 時に出勤して翌朝 7 時に退勤した勤務で、実働は 480 分、22 時から翌朝 5 時までの 420 分が深夜です。残業は 0 + 270 + 0 で 270 分、深夜は 0 + 30 + 420 で 450 分です。

入力

3
09:00 18:00 60
09:00 22:30 60
22:00 07:00 60

出力

270
450

例 2

朝 4 時に出勤した勤務です。4 時から 5 時までの 60 分は、前の夜から続く深夜の時間帯に入ります。勤務の長さは 540 分、実働は 510 分なので、残業は 30 分です。

入力

1
04:00 13:00 30

出力

30
60

ヒント

まだ開いていません

付箋は 3 枚。下の段ほど答えに近づきます

  1. ヒント 2

  2. ヒント 3答えに近い

main.py
import sys

data = sys.stdin.read().split()
n = int(data[0])
records = [(data[1 + 3 * i], data[2 + 3 * i], int(data[3 + 3 * i])) for i in range(n)]

# ここから書く

入力

出力

「実行する」を押すと、ここに出力が出ます

できているか「提出して採点」を押すと、隠れたテストを全部走らせて、通ったかをここに出します