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

前回に引き続き競プロを実施していきたいと思います。

今回の問題は以下です。

マップの判定・横 | レベルアップ問題集 | プログラミング学習サイト【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)
            }
        }
    }
}

これでネストがそこまで深くなく、少し簡潔なコードになりました。

めでたしめでたし。