競技プログラミングを解こう part4
最近AtCoderのA問題が解けるようになってきたので「今日も余裕かな〜」と思って 解いてみたら難しかったです、、泣
けど面白い問題だったので、是非解説していこうと思います!
まずは問題内容です!
問題文
文字列 が入力されます。これは、西暦 年の実在する日付を yyyy/mm/dd
の形式で表したものです。(例えば、 年 月 日は 2019/04/30
と表されます。)
が表す日付が 年 月 日またはそれ以前なら Heisei
、そうでなければ TBD
と出力するプログラムを書いてください。
制約
- は西暦 年の実在する日付を
yyyy/mm/dd
の形式で表す文字列である。
入力
入力は以下の形式で標準入力から与えられる。
出力
が表す日付が 年 月 日またはそれ以前なら Heisei
、そうでなければ TBD
と出力せよ。
入力例 1 Copy
Copy
2019/04/30
出力例 1 Copy
Copy
Heisei
入力例 2 Copy
Copy
2019/11/01
出力例 2 Copy
Copy
TBD
解けましたか??
今回の問題は今までの問題よりも、色々な解き方があると思います!
では解説していきます〜
まずは入力です。
制約
- は西暦 年の実在する日付を
yyyy/mm/dd
の形式で表す文字列である。
入力
入力は以下の形式で標準入力から与えられる。
yyyy/mm/ddなので
ex) 2019/03/31 (僕の誕生日、、笑)
上記の様に年月日を / で区切って入力できる様にしてあげればいいんですね。
区切るといったら split
入力といったら gets
上記のメソッドですね〜
入力は
y, m, d = gets.split("/").map(&:to_i)
これで 2018/03/31 と入力すると
y,m,d = gets.split("/").map(&:to_i)
2018/03/31
=> [2018, 3, 31]
となります!
map(&:to_i) っていらないんじゃ?と思いがちですが
ですが、、
y,m,d = gets.split("/")
2018/03/31
=> ["2018", "03", "31\n"]
Stringになってしまい、なおかつgetsを使っているので改行が付いてしまうんですね。
なのでIntegerにするために map(&:to_i) が必要なんです!
ちなみに僕は入力が
入力
入力は以下の形式で標準入力から与えられる。
だったので一文字の入力で yyyy/mm/dd を表さなければいけないと思ってハマってました、、笑
けど別に y, m, d みたいに分けてもいいみたいですね。
次は出力を考えていきましょう。
日付が 年 月 日またはそれ以前なら
Heisei
、そうでなければ TBD
と出力せよ。4月は30日が最終日です。
なので4月ならHeisei 5月ならTBD と言い換えることができます。
m > 4
つまり上記のように不等号で表現できます。
後は if 式に当てはめるだけです〜
- if m > 4
- puts "TBD"
- else
- puts "Heisei"
- end
なので答えはこうなります。
- y, m, d = gets.split("/").map(&:to_i)
- if m > 4
- puts "TBD"
- else
- puts "Heisei"
- end
僕は日付だったので Date Classとか使うのかなーと思ってたんですが、使わなくても全然いけますね!笑
個人的に「なるほど〜!!」と思った答えがありました。