AtCoderをやり始めた。 全然問題が解けないので、復習する。
問題
$N$行$N$列のマス目が与えられる。上から$i$行目、左から$j$列目のマスには整数$A_{i,j}$が書かれています。ここで、$A_{i,j}$は$0$か$1$であることが保証されます。 マス目の外側のマスに書かれた整数を時計回りに$1$個ずつずらしたときのマス目を出力してください。 ただし、外側のマスとは、$1行目$、$N行目$、$1列目$、$N列目$のいずれか$1$つ以上に属するマスの集合のことを指します。
制約
- $ 2 \leq N \leq 100 $
- $ 0 \leq A_{i,j} \leq 1(1 \leq i、j \leq N) $
- $ 入力される数値はすべて整数 $
解き方
これは、入力値$A_{i,j}$を文字列の配列で受け取り。
文字列をうまく加工して、処理させる。
Go言語の文字列操作を理解できていなかったことが敗因なので、以後注意する。
正しい解
package main import ( "bufio" "fmt" "os" "strconv" ) var sc *bufio.Scanner func scanInt() int { sc.Scan() i, _ := strconv.Atoi(sc.Text()) return i } func scanString() string { sc.Scan() return sc.Text() } func main() { sc = bufio.NewScanner(os.Stdin) sc.Split(bufio.ScanWords) N := scanInt() A := make([]string, N) for i, _ := range A { A[i] = scanString() } B := make([]string, N) t := "" for i, v := range A { if i == 0 { // 一番上 t = v[N-1:] B[i] = A[i+1][:1] + v[:N-1] } else if i < N-1 { // 真ん中 B[i] = A[i+1][:1] + v[1:N-1] + t t = A[i][N-1:] } else { // 一番下 B[i] = v[1:] + t } } for _, v := range B { fmt.Println(v) } }