こんにちは、ナナオです。
せっかく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を使うと楽しいですね。
今後チャンネルとか使えればいいんですが、競プロでチャンネル使う機会あるかな…?