AtCoder が提供しているABC(AtCoder Beginner Contest)309 のB問題をC++とPythonで解いてみました。ABC309は、2023年7月8日21:00に実施されました。
AtCoder の紹介はこちらに、プログラミングの方針はこちらに記事があります。
B問題 Rotate(Difficulty : 124)
問題はリンク先をご覧ください。
与えられたグリッドの周辺の文字だけを回転します。AtCoder Problems による Difficulty は 124 でした。
解答案
問題では、0か1の数字の列として与えられています。しかし、プログラムとしては、文字として扱います。
周辺にあたる最初の行と最後の行、中間にある行は一番左の文字と一番右の文字を以下の方針で書き換えます。
- 最初の行
- 一文字右にずらす。
- 一番左の文字は、ひとつ下の行の一番左の文字になる。
- 中間の行
- 一番左の文字は、ひとつ下の行の一番左の文字になる。
- 一番右の文字は、ひとつ上の行の一番右の文字になる。
- 最後の行
- 一文字左にずらす。
- 一番右の文字は、ひとつ上の行の一番右の文字になる。
C++ プログラム例(ABC309B)
上記の手順をそのままプログラムにします。読み込んだ文字列の配列 a とは別に出力する文字列の配列 b を用意して、a の値を元に b の値を決めていきます。b の初期値は、a にしています(12行目)。
以下が、C++プログラムとなります。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin >> n;
vector<string> a(n);
vector<string> b(n);
for (int i = 0; i < n; ++i) {
cin >> a[i];
b[i] = a[i];
}
b[0][0] = a[1][0];
for (int j = 0; j < n - 1; ++j) {
b[0][j + 1] = a[0][j];
}
for (int i = 1; i < n - 1; ++i) {
b[i][0] = a[i + 1][0];
b[i][n - 1] = a[i - 1][n - 1];
}
for (int j = 0; j < n - 1; ++j) {
b[n - 1][j] = a[n - 1][j + 1];
}
b[n - 1][n - 1] = a[n - 2][n - 1];
for (int i = 0; i < n; ++i) {
cout << b[i] << endl;
}
return 0;
}
AC(Accepted=正しいプログラム)と判定されました。
Python プログラム例(ABC309B)
Python 版も考え方は C++ の場合と同じです。ただし、Python の文字列は書き換えができないため文字列のリスト b[i] に結果の文字を連結しています。
"""AtCoder Beginner Contest 309 B"""
n = int(input())
a = [input() for i in range(n)]
b = ["" for i in range(n)]
b[0] += a[1][0]
for j in range(n - 1):
b[0] += a[0][j]
for i in range(1, n - 1):
b[i] += a[i + 1][0]
for j in range(1, n - 1):
b[i] += a[i][j]
b[i] += a[i - 1][n - 1]
for j in range(n - 1):
b[n - 1] += a[n - 1][j + 1]
b[n - 1] += a[n - 2][n - 1]
for i in range(n):
print(b[i])
こちらも「AC」と判定されました。
最後に
このような問題は、計算で一気に書き換えるのは難しいと思います。方針を明確にしてプログラムに落とし込みました。
引き続き ABC の問題を紹介していきます。