第95回【Python】文字列

現在取り組んでいるのは、paiza ラーニング問題集「C ランクレベルアップメニュー」になります。

はじめに

猫とキャンプと野球観戦と AWS が大好きな旦那、LeoSaki です。モフモフしたい。

Python をゼロから勉強してみよう、のコーナー 95 回目です。

社内が暑い。サーバーや複数の PC からの放熱でとにかく暑い。クーラーをつけても LeoSaki(旦那)の席は奥ばった場所なので、なかなか冷気が訪れない。扇風機を独占させてもらっています。

それでは、今日も頑張ってみようと思います。

文字列

パイザ君の家の前では毎週日曜日に工事が行われます。この先 N 週間、工事が日曜日の何時に始まり、どれくらいの時間続くのかは分かっています。パイザ君は工事の間は家を離れようと思っているので、それぞれの日に工事が何時に終わるのかを知りたいと思いました。

工事が N 週間続くとして、各週日曜日の工事が始まる時刻と、工事が何時間何分続くのかに関する情報が与えられるので、工事が終わる時刻を 00:00 から 23:59 までの 24 時間表記で出力してください(ここで「工事が終わる時刻」とは、工事が h 時間 m 分続くとした場合、工事が始まった時刻の h 時間 m 分後を指します)。

入力された通りの順番で、各週の工事が終わる時刻を N 行出力してください。時刻の表記は入力と同じフォーマットに従うものとし、 24 時以降は翌日の時刻を記し、 00:00 から 23:59 までの間に収まるように、また、時や分を表す数字が1桁の場合には十の位を 0 で埋めてください。たとえば 24 時は 00:00、 27 時は 03:00 となります。

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 ≤ 50
・ 0 ≤ h_i ≤ 23
・ 0 ≤ m_i ≤ 59


入力例

2
15:59 0 1
23:20 1 0

出力例

16:00
00:20

datetime を利用すれば結構簡単、な気がする。しかし、模範解答はとても面倒なことをしていた。

Python
import datetime
N = int(input())
for _ in range(N):
    t,h,m = input().split()
    tdata = datetime.datetime.strptime(t,'%H:%M')
    tdata_add = tdata + datetime.timedelta(hours=int(h),minutes=int(m))
    print(f'{tdata_add:%H:%M}')
Python(模範解答)
N = int(input())
for i in range(N):
    t, h, m = input().split()
    th = int(t[:2])
    tm = int(t[3:])
    h = int(h)
    m = int(m)

    ah = th + h
    am = tm + m

    if am >= 60:
        ah += 1
        am -= 60
    if ah >= 24:
        ah -= 24

    ah = str(ah)
    am = str(am)

    if len(ah) == 1:
        ah = "0" + ah
    if len(am) == 1:
        am = "0" + am
    print(ah + ":" + am)
VBA
N = Cells(1, 1)
For i = 1 To N
    THM = Split(Cells(i + 1, 1), " ")
    T = Format(THM(0), "hh:mm")
    Debug.Print Format(DateAdd("h", Val(THM(1)), DateAdd("n", Val(THM(2)), T)), "hh:mm")
Next

最後に

便利な関数を使って素早くコードを書くのも技術のうち、と思う。模範解答にあるやり方だと、読みづらいし、何をやっているか分かりづらい・・・こともないか。手間はかかっていそうだけれど。

よく問題を読んでみると、パイザ君は最大 50 週の日曜日に最大 23 時間 59 分、家を離れる必要があるようで、そうなったらもう文句を言ってもいい気がする。まぁ、パイザ君が勝手に家を離れるだけなので、家を離れるほどの騒音ではないのかもしれない。LeoSaki(旦那)なら我慢して家に閉じこもるかなぁ。

引き続き、よろしくお願いいたします!

Pythonpaiza,学習,Python

Posted by LeoSaki