Goでコーディングテスト受ける時に入力はfmt.Scanは使うな

Go言語

今までGo言語でコーディングテストを学んでいたのですが、fmt.Scanでの入力が遅いせいでアルゴリズムが良くてもタイムアウトしてしまうことが発生していた。Scannerで入力するようにしたらタイムアウトが起きなくなり、fmt.ScanとScannerでどれくらい違うのかを今回比較しました。

試したこと

10,000行 * 10列のデータが入力された場合に実行時間とメモリの使用量が違うかを計測
計測にはAtCoderのコードテストを使用した

fmt.Scanを使用した場合

コード

package main

import(
  "fmt"
)

func main(){
  var n, m = 10000, 10
  var input [][]int
  input = make([][]int, n)
  for i:=0;i<n;i++{
    input[i] = make([]int, m)
    for j:=0;j<m;j++{
      fmt.Scan(&input[i][j])
    }
  }
}

結果
実行時間 206 ms
メモリ 5684 KB

Scannerを使用した場合

コード

package main

import(
  "bufio"
  "os"
  "strconv"
)

func main(){
  var n, m = 10000, 10
  var input [][]int
  scanner := bufio.NewScanner(os.Stdin) // 標準入力を受け付けるスキャナ
  scanner.Split(bufio.ScanWords)
  
  input = make([][]int, n)
  for i:=0;i<n;i++{
    input[i] = make([]int, m)
    for j:=0;j<m;j++{
      scanner.Scan()
      input[i][j], _ = strconv.Atoi(scanner.Text())
    }
  }
}

結果
実行時間 11 ms
メモリ 1776 KB

fmt.Scanを使用すると、Scannerを使用した時より、実行時間が20倍近くかかるのがわかる

まとめ

Go言語での入力はScannerを使用するのが良いことがわかりました。
Go言語について他にも、selectの仕組みやゴルーチンで並行実行した処理のエラー検知する方法などの記事を書いておりますので、そちらも見てもらえたらと思います。

【おすすめ記事のリンク】

コメント

タイトルとURLをコピーしました