※スキルチェック問題ではありません。
規約により公式の解答コードそのままはよろしくないので、
オリジナルのコードにしています。
詳しくはコチラ
なるべくわかりやすい解説を付けました
FINAL問題 文字列 (paizaランク C 相当)
パイザ君の家の前では毎週日曜日に工事が行われます。この先 N 週間、工事が日曜日の何時に始まり、どれくらいの時間続くのかは分かっています。パイザ君は工事の間は家を離れようと思っているので、それぞれの日に工事が何時に終わるのかを知りたいと思いました。
工事が N 週間続くとして、各週日曜日の工事が始まる時刻と、工事が何時間何分続くのかに関する情報が与えられるので、工事が終わる時刻を 00:00 から 23:59 までの 24 時間表記で出力してください(ここで「工事が終わる時刻」とは、工事が h 時間 m 分続くとした場合、工事が始まった時刻の h 時間 m 分後を指します)。
- 入力される値
- 入力は以下のフォーマットで与えられます。
N t_1 h_1 m_1 ... t_N h_N m_N
1 行目には工事が続く週の数を表す正整数 N が与えられ、 2 行目から (N + 1) 行目には工事が始まる時刻と、工事がどれくらい続くのかについての情報が、 “t_i h_i m_i” という形式で与えられます(1 ≤ i ≤ N)。これは時刻 t_i に工事が始まり、 h_i 時間 m_i 分工事が続くことを意味しています。t_i, h_i, m_i は各行において半角スペース区切りで与えられます。
t_i は 24 時間表記で時刻を表す文字列で、 “AB:XY” という形をしており、これは AB 時 XY 分を表します。ただし、今回は 00:00 から 23:59 までの 24 時間表記を採用し、時・分を表す数字が 1 桁の場合には十の位を 0 で埋めます。
入力値最終行の末尾に改行が1つ入ります。
文字列は標準入力から渡されます。
- 期待する出力
- 入力された通りの順番で、各週の工事が終わる時刻を N 行出力してください。時刻の表記は入力と同じフォーマットに従うものとし、 24 時以降は翌日の時刻を記し、 00:00 から 23:59 までの間に収まるように、また、時や分を表す数字が1桁の場合には十の位を 0 で埋めてください。たとえば 24 時は 00:00、 27 時は 03:00 となります。
末尾に改行を入れ、余計な文字、空行を含んではいけません。
- 条件
- すべてのテストケースにおいて、以下の条件をみたします。
・ 1 ≤ N ≤ 50
・ 0 ≤ h_i ≤ 23
・ 0 ≤ m_i ≤ 59
- 入力例1
-
1 13:00 1 30
- 出力例1
-
14:30
- 入力例2
-
2 15:59 0 1 23:20 1 0
- 出力例2
-
16:00 00:20
解答 (入力例2で解説)
#1行目の入力値(数値)を変数に代入する n = gets.to_i #n回繰り返す n.times do # timeに[15,59]というように:(コロン)の部分で分割して配列として代入していく # hに0、mに1というように数値として代入する time,h,m = gets.split.map.with_index { |val,i| i == 0 ? val.split(':') : val.to_i } #数値に変換して時を示す変数に代入する(このときhを加算) hours = (time[0].to_i + h) #数値に変換して分を示す変数に代入する(このときmを加算) minutes = (time[1].to_i + m) #分が60以上の時 if minutes >= 60 #1時間増やす hours += 1 #60分減らす minutes -= 60 end #時間が24以上の時−24する hours -= 24 if hours >= 24 #時間と分が10より小さい時に0埋めして(01:02)のように0つきの時間と分を表現できるようにする hours = "0#{hours}" if hours < 10 minutes ="0#{minutes}" if minutes < 10 #時間と分を:(コロン)を間に挟んで出力する puts hours.to_s + ":" + minutes.to_s end