AtCoder が提供しているABC(AtCoder Beginner Contest)296 のB問題をC++とPythonで解いてみました。ABC296は、2023年4月1日21:00に実施されました。
AtCoder の紹介はこちらに、プログラミングの方針はこちらに記事があります。
B問題 Chessboard(Difficulty : 31)
問題はリンク先をご覧ください。
2重ループにより特定の文字を見つける問題です。AtCoder Problems による Difficulty は 31 でした。
解答案
問題を以下の方針で解きます。
- 文字列を8個読み込む。
- 2重ループにより、文字 ’*’ の場所を探す。
- 文字 ’*’ の場所を以下の2文字で表示する。
- 左からの場所を a, b, c, …, g, h で表示する。
- 下からの場所を 1, 2, 3, …, 7, 8 で表示する。
C++ プログラム例(ABC296B)
2重ループにより、文字 ’*’ を探します。最初のループ変数 i は上からの場所を示します。次のループ変数 j は左からの場所を示します。どちらのループ変数も 0 からカウントしています。
左からの場所(result_x)は、ループ変数 j に ‘a’ を加えることにより、文字に変換しています(16行目)。下からの場所(result_y)は、上からのカウントしているため、8からループ変数 i 引いて変換しています(17行目)。
以下が、C++プログラムとなります。
#include <bits/stdc++.h>
using namespace std;
int main()
{
vector<string> s(8);
for (int i = 0; i < 8; ++i) {
cin >> s[i];
}
int result_x;
int result_y;
for (int i = 0; i < 8; ++i) {
for (int j = 0; j < 8; ++j) {
if (s[i][j] == '*') {
result_x = 'a' + j;
result_y = 8 - i;
}
}
}
cout << (char)result_x << result_y << endl;
return 0;
}
AC(Accepted=正しいプログラム)と判定されました。
Python プログラム例(ABC296B)
Python は、C++のプログラムをそのまま移植しました。print 文で二つの引数の間をデフフォルト(空白)から変更するために、sep を空文字に指定しています(10行目)。
"""AtCoder Beginner Contest 296 B"""
s = [input() for i in range(8)]
for i in range(8):
for j in range(8):
if s[i][j] == '*':
result_x = chr(ord('a') + j)
result_y = 8 - i
print(result_x, result_y, sep="")
こちらも「AC」と判定されました。
最後に
2重の繰り返しで文字列を走査する問題でした。文字列の配列は、上から添え字をカウントしますが、問題では下からカウントするように指定されていました。このような変換も慣れてくれば、できるようになります。
引き続き ABC の問題を紹介していきます。