こんにちは、ナナオです。

せっかくGoのチュートリアルを終えたので、今度は実践編ということでpaizaの練習問題を解いていこうと思います。

今回はこちらの問題です。

盤面の情報取得 | レベルアップ問題集 | プログラミング学習サイト【paizaラーニング】

まず標準入力をどうするか

最初の問題にふさわしいというか、標準入力のやり方がまだよく分かっていないので助かります。

入力は以下のような形式です。

H W N   
S_0     
...     
S_(H-1)    
y_1 x_1     
...     
y_N x_N

最初の一行は割と簡単に取得できます。

    var h, w, n int
    fmt.Scan(&h, &w, &n)

その後の行については以下のサイトを参考に実装しました。

【備忘】Go 言語の標準入力の基本的なこと #初心者向け - Qiita

sc := bufio.NewScanner(os.Stdin)
s := make([][]string, h)
for i := 0; i < h; i++ {
    sc.Scan()
    s[i] = strings.Split(sc.Text(), "")
}

うーん、まぁここはもっとスマートに出来そうな気がしますが、とりあえずこれで。。

実装

標準入力ができればあとは割と簡単に実装できます。

全体の実装は以下の通りです。

package main
import (
    "fmt"
    "bufio"
    "os"
    "strings"
    "strconv"
)
func main(){
    var h, w, n int
    fmt.Scan(&h, &w, &n)

    sc := bufio.NewScanner(os.Stdin)
    s := make([][]string, h)
    for i := 0; i < h; i++ {
        sc.Scan()
        s[i] = strings.Split(sc.Text(), "")
    }
    for i := 0; i < n; i++ {
        sc.Scan()
        inputs := strings.Split(sc.Text(), " ")
        y, _ := strconv.Atoi(inputs[0])
        x, _ := strconv.Atoi(inputs[1])
        fmt.Println(s[y][x])
    }
}

str -> intの変換にstrconvを使わなきゃいけなかったりするあたりがちょっと面倒ですが、まぁ静的言語のありがたい部分でもあります。

しかしこの実装だけで5つも標準パッケージを使うことになるとは。。

なんか他にやり方あるのかな?

まとめ

とりあえず今回はこんな感じです。

やっぱり実践的にGoを使うと楽しいですね。

今後チャンネルとか使えればいいんですが、競プロでチャンネル使う機会あるかな…?