ebisukeプログラミング初心者脱出黙示録

30歳を過ぎてから始めたプログラミングと競プロの記録。Pythonで取り組んでいます。Arduinoで電子工作も

AtCoder-ARC015 B - 真冬日?真夏日?【Python解答例】

今回もAtCoder ProblemsのRecommendationでおすすめされた問題を解いていきます。

取り組む問題はAtCoder Regular Contest015 B - 真冬日真夏日?です。


AtCoder Regular Contest015 B - 真冬日真夏日

atcoder.jp

問題文

夏になると「真夏日」や「熱帯夜」などをよく耳にしますが、実際には次のように予報用語が定義されています。
猛暑日:最高気温が 35 度以上の日
真夏日:最高気温が 30 度以上、35 度未満の日
夏日 :最高気温が 25 度以上、30 度未満の日
熱帯夜:最低気温が 25 度以上の日
冬日 :最低気温が 0 度未満で、最高気温が 0 度以上の日
真冬日:最高気温が 0 度未満の日
いま、ある地点での日毎の最高気温と最低気温の観測結果が与えられます。
このとき、上述した猛暑日真夏日、夏日、熱帯夜、冬日真冬日はそれぞれ何日ずつあったかを出力してください。
ただし、ここでの「気温」とは、摂氏のことを表します。
複数の予報用語に属する日が存在することに注意してください。

解答例

n = int(input())

Max = []
Min = []
for i in range(n):
    a, b = map(float,input().split())
    Max.append(a)
    Min.append(b)

too_hot = 0 # 猛暑日
hot = 0 # 真夏日
warm = 0 # 夏日
hot_night = 0 # 熱帯夜
cold = 0 # 冬日
too_cold = 0 # 真冬日

for i in range(n):
    if Max[i] >= 35:
        too_hot += 1
    elif Max[i] >= 30:
        hot += 1
    elif Max[i] >= 25:
        warm += 1
    elif Max[i] < 0:
        too_cold += 1
    if Max[i] >= 0 and Min[i] < 0:
        cold += 1
    if Min[i] >= 25:
        hot_night += 1
else:
    print(str(too_hot) + " " + str(hot) + " " + str(warm) + " " + str(hot_night) + " " + str(cold) + " " + str(too_cold))

解説

N日分の最高気温と最低気温が与えられます。
その中で真夏日冬日などがそれぞれ何日あるか答える問題です。

日数Nは最大3650日なのでそれぞれの日において真夏日などに該当するか全探索して調べました。

これまでAtCoderの標準入力は整数しかありませんでしたが、今回初めて小数がありました。
よってint関数でなくfloat関数を使って入力を受け取りました。

あとはi日目の最高気温と最低気温が真夏日などに該当しないか一日一日確認していきます。
注意として猛暑日かつ熱帯夜の日のようにi日目が該当するのは1つだけとは限りません。
ひとつのif文でまとめると、上記のような猛暑日かつ熱帯夜のような日がどちらかひとつしかカウントできなくなります。
したがって重複する可能性がある項目はif文を分けて記載しました。

上記に気を付けて全探索を行い、最後にそれぞれの日数を出力してACでした。
変数はstr型でないと出力できないことを今回初めてしりました (^_^;)




レコメンドされた問題は昔の問題だったので、傾向の違いを感じました。
floatとか出力を1行にまとめることはこれまでなかったです。

もしかしたら最近の問題には活かせないかもしれませんがいろいろな知識を得ることができてよかったです。