2020-11-01(日) 初めてAtCoderのコンテストに参加した
きっかけ、事前準備
転職したことから存在は知っていたAtCoder
なんとなくやろうとしてたけどやらず、けどちょうど良いタイミングでその日の夜に開催が予定されていたため登録して参加
参加したのはこのBeginner Contest
使うのは今使っているGolangで。事前に例題で解き方を確認したり。
転職時のスキルテストとかで入力して解答みたいなのはやったことがあるので、操作で何か違和感があるところもなく。
標準入力は fmt.Scanf
でやるんだなぁとか思いつつ準備
本番
やってみた感想
21時からやったところ、解けたのはB問題まで。 やってみると処理はかけるけど、実行時間に制限があったりで、数学やアルゴの効率が良い処理方法がわかってないと、どうすれば良いか調べるのにかなり時間がかかった。
文系出身であまりやってないツケがきてるけど、このあたりエンジニアでやってくには必須なのでどこかで勉強したいところ。
とりあえずはAtCoderを解きながら身につけていこうかなと。。
A問題解答
A問題はFizBazみたいな、与えられた入力パターンに応じて文字列を返す形
自分の解
package main import "fmt" func main(){ var i int fmt.Scanf("%d", &i) if (i % 2) == 0 { fmt.Println("White") } else { fmt.Println("Black") } }
これは特に問題なくすんなり。
B問題解答
問題はB問題
最初の解答
package main import "fmt" func main(){ var n int fmt.Scanf("%d", &n) var sum int var b, c int for i := 0; i < n; i++ { fmt.Scanf("%d %d", &b, &c) for a := b; a <= c; a++ { sum = sum + a } } fmt.Println(sum) }
最初はN回、Aを1ずつ、Bになるまで増やしていった数の和
を求めれば良いかなとか思いgolang range 1 to 10
とかで検索して以下を参考に。
動くは動くけど、提出するとTLE(時間切れ)となりパスできない。
数学の知識がなく効率の良い求め方がわからず1〜Nの和
とかで色々調べた結果、ガウスが見つけた解法で効率よく計算できるみたい。
www.youtube.com (これがガウス定理か・・?と思ったけど全然違うようだった)
等差数列
というらしい
hensa40.cutegirl.jp
パスした解答
package main import "fmt" func main(){ var n int fmt.Scanf("%d", &n) var sum int var b, c int for i := 0; i < n; i++ { fmt.Scanf("%d %d", &b, &c) sum += (c - b + 1) * (b + c) / 2 } fmt.Println(sum) }
C問題解答
解答ならず atcoder.jp
B問題を解いた時点で1時間ぐらい。 Cに取り組むも、どうしたら良いかまでたどり着かず終了
なぜ入力例 2がNoで入力例 3がYesかわからず、ボードにかいてみたりしたが、
y - xが一致or0が三つの時?
とか考えたが解答まで至らず。。
解説
解説を見て、傾きが等しいかで判断すれば良いとまでは理解したけど、 Goでどうかくか?までできなかったので、後日解説を見ながら取り組む。