Taku’s Teckブログ

Teckはわざとです。

2020-11-01(日) 初めてAtCoderのコンテストに参加した

きっかけ、事前準備

転職したことから存在は知っていたAtCoder

なんとなくやろうとしてたけどやらず、けどちょうど良いタイミングでその日の夜に開催が予定されていたため登録して参加

参加したのはこのBeginner Contest

atcoder.jp

使うのは今使っているGolangで。事前に例題で解き方を確認したり。

qiita.com

転職時のスキルテストとかで入力して解答みたいなのはやったことがあるので、操作で何か違和感があるところもなく。 標準入力は fmt.Scanf でやるんだなぁとか思いつつ準備

本番

やってみた感想

21時からやったところ、解けたのはB問題まで。 やってみると処理はかけるけど、実行時間に制限があったりで、数学やアルゴの効率が良い処理方法がわかってないと、どうすれば良いか調べるのにかなり時間がかかった。

文系出身であまりやってないツケがきてるけど、このあたりエンジニアでやってくには必須なのでどこかで勉強したいところ。

とりあえずはAtCoderを解きながら身につけていこうかなと。。

A問題解答

A問題はFizBazみたいな、与えられた入力パターンに応じて文字列を返す形

atcoder.jp

自分の解

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問題

atcoder.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)
    for a := b; a <= c; a++ {
      sum = sum + a
    }
  }
  fmt.Println(sum)
}

最初はN回、Aを1ずつ、Bになるまで増やしていった数の和を求めれば良いかなとか思いgolang range 1 to 10とかで検索して以下を参考に。

stackoverflow.com

動くは動くけど、提出すると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が三つの時?とか考えたが解答まで至らず。。

f:id:taku-exs:20201107195951p:plain

解説

atcoder.jp

解説を見て、傾きが等しいかで判断すれば良いとまでは理解したけど、 Goでどうかくか?までできなかったので、後日解説を見ながら取り組む。