こんにちは、ナナオです。
前回に引き続き競プロを実施していきたいと思います。
今回の問題は以下です。
マップの判定・横 | レベルアップ問題集 | プログラミング学習サイト【paizaラーニング】
実装
行った実装は以下の通りです。
package main
import (
"fmt"
"strings"
)
func main(){
var h, w int
fmt.Scan(&h, &w)
s := make([][]string, h)
for i := 0; i < h; i++ {
var line string
fmt.Scan(&line)
s[i] = strings.Split(line, "")
}
for i := 0; i < h; i++ {
for j := 0; j < w; j++ {
if j == 0 {
if s[i][j + 1] == "#" {
fmt.Println(i, j)
}
} else if j == len(s[i]) - 1 {
if s[i][j - 1] == "#" {
fmt.Println(i, j)
}
} else if s[i][j - 1] == "#" && s[i][j + 1] == "#" {
fmt.Println(i, j)
}
}
}
}
ただ計算量がO(N^2)だったり、ifのネストが深かったりあまりスマートなコードとは言えません。
isWall関数を実装してもっとスマートにします。
package main
import (
"fmt"
)
func main(){
var h, w int
fmt.Scan(&h, &w)
s := make([]string, h)
for i := 0; i < h; i++ {
fmt.Scan(&s[i])
}
isWall := func(r, c int) bool {
if c < 0 || c >= w {
return true
}
return s[r][c] == '#'
}
for i := 0; i < h; i++ {
for j := 0; j < w; j++ {
if isWall(i, j - 1) && isWall(i, j + 1) {
fmt.Println(i, j)
}
}
}
}
これでネストがそこまで深くなく、少し簡潔なコードになりました。
めでたしめでたし。