日別アーカイブ: 2022年9月2日

paizaCランクレベルアップ問題と解答(7) FINAL問題 文字列 Ruby

※スキルチェック問題ではありません。
規約により公式の解答コードそのままはよろしくないので、
オリジナルのコードにしています。

詳しくはコチラ

なるべくわかりやすい解説を付けました

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