在宅勤務になったのでマネジメント系SEが競技プログラミング始めてみた。


この記事を執筆するにあたって

こんにちは、始めてのQiita投稿です。
文章等見づらいかもしれませんが、今後改善したいと思っています。

コロナ対策の影響で在宅勤務中心となっているご時世です。

そのため私も毎日40分前後×往復分で勤務していた時間が減ったので、
会社の後輩にも話を聞いて、競技プログラミングを知りました。

不定期更新になるし、どこまで続くかわかりませんが、
自身のモチベーション継続と、誰かのモチベーション向上のキッカケになればと思います。
(とはいえQiita投稿も初なので、どれくらいの人が見てくれるのか。。)

私の経歴

学生時代に地方大学の情報系学部&大学院を卒業

 学生時代はC言語、C++、Ruby、CUDA(CPU Computing)に加えて
 サーバ構築なんかもやってました。

某大手企業に就職し上京。

 - 社内IaaS基盤の構築や新規増設などを実施
 - AWSなどを使ったクラウド案件の外販業務を実施
   AWSソリューションアーキテクトを取得
 - コンシューマ向けiOSアプリ開発リーダ
   スクラム開発を用いたiOSアプリの開発リーダをやってました。
   Swiftは軽く読めるけど、自分ではかけないレベルで設計書レビューしたり。。
   基本的にはベンダへ委託し、ベンダコントロールを行う感じでした。
 - スクラム開発の社内啓蒙活動リーダ
   スクラム開発でCSM、CSPOといった認定資格を保持していたのもあり
   社内でスクラム開発を育成するリーダをやっていました。
 - 新規アプリ開発検討リーダ
   現在新規サービスを意識したアプリ開発を行うことになり検討中

本題

競技プログラミング(AtCoder)

前置きが長くなりましたが、競技プログラミングを始めるにあたって後輩からAtCoderを勧められたので、このサイトから始めることにしました。

AtCoderの始め方から非常にわかりやすいです。
AtCoderって何?みたいなところは以下リンクの記事を参照いただいた方が絶対いいので
私の方では簡単に。。。(解釈間違ってたらすいません)

AtCoderとは

日本初のプログラミングコンテスト運営会社がやっているコンテストらしい。。
定期的にコンテストを行っており、その結果に応じてRankやLevelが決まっていくようです。

またその結果を条件に就職や転職に活かすこともできるようです。
(私が始めようと思ったキッカケもまさにここです!!)

AtCoder に登録したら次にやること ~ これだけ解けば十分闘える!過去問精選 10 問 ~

使用言語

使用言語は最近流行のPythonをやってみようと思ったのですが、
意外にも(?)学生時代にやっていたC++が多く使われているようなので
C++に決めました。

開発環境

学生時代はemacsでターミナルからゴリゴリ書いていました。
なぜかそのせいで便利なコード補完機能を使いたくない病にかかり、、
そういった病気を治すためにもXcodeで始めることにしました。

実際に始めた時のギャップ

AtCoderの過去問を進めるにあたって、そもそもC++をすっかり忘れていました。
もともとC言語をやっていたこともあって、標準入出力が以下のイメージだったんですね。。

sample1.cpp
#include<stdio.h>

int main(void){
 int n;
 scanf("%d", n);

 return 0;
}

ただXcodeを開いたときに真っ先にこんなフォーマットでした。
確かにC++の標準入出力ってこうも書けますね。。。

sample2.cpp
#include <iostream>

int main(int argc, const char * argv[]) {
 int n;
 cin << n;

 return 0;
}

競技プログラミング的にはsample1.cppの方が速度は出るらしいですが、
今の私はまだそのレベルではないので
ひとまずC++のお作法であるsample2.cppに則ることにしました。

過去問を解いてみて

冒頭に紹介したこちらのサイトを元に、過去問を解いてみました。
以降は私のレベルを感じてムフフと笑う人や今後成長を感じてくれる優しい人、もしくは同じキッカケで始めてるような人で人のレベルが気になる人向けです(笑)

第 1 問: ABC 086 A - Product (100 点)

 はい!簡単!!
 と思ったけど、あれ?エラーが。。。
 そういえばC++ってセミコロン必要だったね。。
 そんなこんなで10分程でようやくAC
 

第 2 問: ABC 081 A - Placing Marbles (100 点)

 あれ?Stringってどう扱うんだっけ。。。
 結局ここでも20分程つかってしまいAC

第 3 問: ABC 081 B - Shift Only (200 点)

 これはすんなりAC

第 4 問: ABC 087 B - Coins (200 点)

 あーーfor文懐かしい。。と思ってこちらもわりかしすんなりAC

第 5 問: ABC 083 B - Some Sums (200 点)

 ここですんなりいってたけど壁にぶつかりました。
 何か結局うまくいかなくてデバックすること1時間でようやくAC。。。
 回答みると凄いシンプルだしってことで
 回答のコードの書き方で改めて書き直しました。
  

第 6 問: ABC 088 B - Card Game for Two (200 点)

 これはソートすれば良いやん!!って気づいたけど、ソートの書き方が。。。
 ひとまず独自にバブルソートを用いて実装し、AC
 解説みるとこんな感じでかけるんですね。

int_sort.cpp // int型配列
  int a[N] ;
  sort(a, a+N); 
str_sort.cpp // string型ベクトル
  vector<string> s;
  sort(s.begin(), s.end()); 
第 7 問: ABC 085 B - Kagami Mochi (200 点)

 これは特に迷わずすんなりAC

今後に向けて

ひとまずリハビリも兼ねてA問題とB問題を一通りクリアしたので
今後はC問題にチャレンジしたいと思います。

追記
続きを執筆しました。
【ABC163へ参加してみた】在宅勤務になったのでマネジメント系SEが競技プログラミング始めてみた。#1