paizaの練習問題を解く マップの判定・横 Go編
こんにちは、ナナオです。 前回に引き続き競プロを実施していきたいと思います。 今回の問題は以下です。 マップの判定・横 | レベルアップ問題集 | プログラミング学習サイト【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) } } } } これでネストがそこまで深くなく、少し簡潔なコードになりました。 ...