はっさんブログ

技術的なまとめ・話題になっているもの・やっていきを配信する

後輩たちに警鐘...競技プログラミングの練習をするぞ!

スポンサーリンク

こんにちは。
はっさん(@hassasa3)です。

f:id:usgitan:20161129221605p:plain

*yukicoderでのプロフィール画像 (いいでしょ)

今日はyukicoderというサイトで競技プログラミングの練習をしました。
いざ解いてみたら初めてにも関わらず途中から楽しくなって、5問チャレンジしたので復習します。

その前にそもそもなぜ競プロの練習を始めようと思ったかを書きます。(今回はこっちメイン)
特に学内プロジェクトの後輩は同じ境遇の方が多いので読んでほしいです。

あなたの実装力どんなもんですか?

ここでいう実装力というのは、問題に対して0からアルゴリズムを考えて正しいコードを書くこととします。
僕は客観的に見て実装力が足りないと思ったから競プロの練習を始めました。

というのも自分がプログラミングの世界に入ったきっかけは、Webアプリを作りたかったからです。
そこからRailsを勉強し始め、現在ではかろうじて動くものが作れるようになりました。(Web/API)

しかし、Railsのようなフレームワークを利用した開発は、既にあるライブラリを仕様に合わせて組み合わせていく作業である面が強いです。

それはそれで知識も経験も必要な大変素晴らしい仕事です。
ですが、これでは本当に0から問題に対してアルゴリズムを考え、コードを書くという力が身につくわけではありません。

実際に僕がインターンをしていたときは、新しい機能に対して同期がライブラリを使わず0からアルゴリズムを考え、実装をしており大変そうにしていました。
(膨大な既存システムにライブラリを組み込むより、0から実装したほうが保守しやすいと判断したためでしょう)(彼は競プロをやっていたため苦しみながらも遂げていました)

また、就職活動においても某R社を始めとして、選考に競プロの問題を出す企業は複数社あります。
それはなぜかと考えると、実務においても上記のようなケースは多く、企業は新人にその力を求めていることが分かります。

以上により、プログラミングによる課題解決力を高めるために、競プロの問題を解いて実装力を身に着けていこう!
とかわいい(?)後輩たちに向けた警鐘でした。

競プロで実装力が身についた!という記事→ satanic0258.hatenablog.com

勉強方法で参考になる記事→ qiita.com

最初はyukicoderでやっていき

yukicoderで競プロの練習をしていきます。
上記で紹介した記事にもある通り、他に見ないゆるふわ感が本田です。

今日はNo.227 簡単ポーカーという問題を解きました。
レベル★1個です。1番易しいレベルになります。

cards = [*1..13]
N = gets.split.map(&:to_i)

match_count = []

cards.each { |card| match_count[card] = N.count(card) }
  
if match_count.include?(3)
  if match_count.include?(2)
    print 'FULL HOUSE'
  else
    print 'THREE CARD'
  end
elsif match_count.include?(2)
  if match_count.count(2) == 2
    print 'TWO PAIR'
  else
    print 'ONE PAIR'
  end
else
  print 'NO HAND'
end

言語はRubyで上記のコードでパスすることが出来ました。

この問題のポイントは入力された数字において、同じ数をどうやって数えるかにあります。
今回は一致したカードの数をいれる配列を用意して、添え字にカードの番号を、内容にその番号の個数を代入するようにしました。

最後に一致したカードの数に沿って表示を変えてあげるとOKです。

その他にRubyにおける標準入力としてgetsを使うことや、入力を整数の配列にして返すmap(&:to_i)などのテクニックも今後活用していきましょう。

書いてる途中に気づきましたがサイトに解説も紹介されています。
他にも他人の提出したコードを見ることができたりと、初心者に嬉しいサービスになっています。

一緒にどんどんやっていきましょう!

最後に

この記事は、後輩に対する圧倒的な善意により生成されました。