shiki0331’s blog

Web Developer. TypeScript / React.js を中心に学んでいます。 ブログ内容で間違っている箇所などありましたら、ご指摘していただけると助かります。

競技プログラミングを解こう part4

最近AtCoderのA問題が解けるようになってきたので「今日も余裕かな〜」と思って 解いてみたら難しかったです、、泣

 

けど面白い問題だったので、是非解説していこうと思います!

 

まずは問題内容です!

 

問題文

文字列 S が入力されます。これは、西暦 2019 年の実在する日付を yyyy/mm/dd の形式で表したものです。(例えば、2019 年 4 月 30 日は 2019/04/30 と表されます。)

S が表す日付が 2019 年 4 月 30 日またはそれ以前なら Heisei、そうでなければ TBD と出力するプログラムを書いてください。

制約

  • S は西暦 2019 年の実在する日付を yyyy/mm/dd の形式で表す文字列である。

入力

入力は以下の形式で標準入力から与えられる。

S

出力

S が表す日付が 2019 年 4 月 30 日またはそれ以前なら Heisei、そうでなければ TBD と出力せよ。


入力例 1 Copy

Copy
2019/04/30

出力例 1 Copy

Copy
Heisei

入力例 2 Copy

Copy
2019/11/01

出力例 2 Copy

Copy
TBD

 

atcoder.jp

 

 

解けましたか??

今回の問題は今までの問題よりも、色々な解き方があると思います!

 

 

では解説していきます〜

 

 

 

 

 

 

まずは入力です。

制約

  • S は西暦 2019 年の実在する日付を yyyy/mm/dd の形式で表す文字列である。

入力

入力は以下の形式で標準入力から与えられる。

S
 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)  が必要なんです!

 

 

ちなみに僕は入力が

入力

入力は以下の形式で標準入力から与えられる。

S
 だったので一文字の入力で yyyy/mm/dd を表さなければいけないと思ってハマってました、、笑
けど別に y, m, d みたいに分けてもいいみたいですね。
 
 
次は出力を考えていきましょう。
 
日付が 2019 年 4 月 30 日またはそれ以前なら Heisei、そうでなければ TBD と出力せよ。
 
4月は30日が最終日です。
なので4月ならHeisei  5月ならTBD  と言い換えることができます。
 
m > 4
 
つまり上記のように不等号で表現できます。
 
後は if 式に当てはめるだけです〜 
  1. if m > 4
  2. puts "TBD"
  3. else
  4. puts "Heisei"
  5. end
 
 
なので答えはこうなります。
  1. y, m, d = gets.split("/").map(&:to_i)
  2. if m > 4
  3. puts "TBD"
  4. else
  5. puts "Heisei"
  6. end
 
 
僕は日付だったので Date Classとか使うのかなーと思ってたんですが、使わなくても全然いけますね!笑
 
個人的に「なるほど〜!!」と思った答えがありました。
  1. puts gets.delete("/").to_i > 20190430 ? "TBD" : "Heisei"                                                       

 

delete("/")  で入力されたスラッシュを消して、20190331みたいに連続させた数字にして不等号で比べるんですね。

 

「こんなやり方もあるんだー!」と思って楽しかったです!

 

 

今までRailsをやってきましたが、正直Rubyの知識を使うことが余りなかったので凄く勉強になりますね。

 

何より楽しいです。笑

 

 

最後まで読んでいただき、ありがとうございました。