paizaの練習問題を解く 【マップの扱い 2】マップの書き換え・縦横 Go編
こんにちは、ナナオです。 前回に引き続き競プロを実施していきたいと思います。 今回の問題は以下です。 【マップの扱い 2】マップの書き換え・縦横 | レベルアップ問題集 | プログラミング学習サイト【paizaラーニング】 実装 以下のように実装しました。 package main import "fmt" func main(){ var h, w, sy, sx int fmt.Scan(&h, &w) g := make([]string, h) for i := 0; i < h; i++ { fmt.Scan(&g[i]) } fmt.Scan(&sy, &sx) repl := func(sy, sx int, r rune) { runes := []rune(g[sy]) runes[sx] = r g[sy] = string(runes) } dy := []int{1, -1, 0, 0, 0} dx := []int{0, 0, 1, -1, 0} for i := 0; i < 5; i++ { ty, tx := sy + dy[i], sx + dx[i] if g[ty][tx] == '.' { repl(ty, tx, '#') } else { repl(ty, tx, '.') } } for i := 0; i < h; i++ { fmt.Println(g[i]) } } ですが、ランタイムエラーが頻発してしまいました。。 ということで修正します。 package main import "fmt" func main(){ var h, w, sy, sx int fmt.Scan(&h, &w) g := make([]string, h) for i := 0; i < h; i++ { fmt.Scan(&g[i]) } fmt.Scan(&sy, &sx) repl := func(sy, sx int, r rune) { runes := []rune(g[sy]) runes[sx] = r g[sy] = string(runes) } dy := []int{1, -1, 0, 0, 0} dx := []int{0, 0, 1, -1, 0} for i := 0; i < 5; i++ { ty, tx := sy + dy[i], sx + dx[i] // 以下のif文を追加 if ty < 0 || tx < 0 || ty >= h || tx >= w { continue } if g[ty][tx] == '.' { repl(ty, tx, '#') } else { repl(ty, tx, '.') } } for i := 0; i < h; i++ { fmt.Println(g[i]) } } インデックスが表からはみ出していた場合の考慮が漏れていました。 ...