Try T.M Engineer Blog

多摩市で生息するエンジニアが「アウトプットする事は大事だ」と思って始めたブログ

AtCoder Beginner Contest 309 B - Rotate

AtCoderをやり始めた。 全然問題が解けないので、復習する。

atcoder.jp

問題

$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)
    }
}