AtCoder

ABC296 B問題(Chessboard)を解く

AtCoder_ABC296_B

AtCoder が提供しているABC(AtCoder Beginner Contest)296 のB問題をC++とPythonで解いてみました。ABC296は、2023年4月1日21:00に実施されました。

AtCoder の紹介はこちらに、プログラミングの方針はこちらに記事があります。

B問題 Chessboard(Difficulty : 31)

問題はリンク先をご覧ください。

ABC296 B問題 Chessboard

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 の問題を紹介していきます。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA