AtCoder

ABC269 B問題(Rectangle Detection)を解く

AtCoder_ABC269_B

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

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

B問題 Rectangle Detection(Difficulty : 68)

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

ABC269 B問題 Rectangle Detection

10×10の文字列を読み込んで、’#’ が入っている場所を探します。AtCoder Problems による Difficulty は、68 でした。

解答案

問題を解く方針を書きだします。

  • 10行の文字列を読み込む。
  • # が存在する範囲を覚えておく。
  • # が存在する範囲を出力する。

A問題と比較すると、初心者には難しく感じる難易度の問題だと思います。

C++ プログラム例(ABC269B)

#include <bits/stdc++.h>
using namespace std;

int main()
{
	int a, b, c, d;

	vector<string> s(10);
	for (int i = 0; i < 10; ++i) {
		cin >> s[i];
	}

	a = 11;
	b = 0;
	c = 11;
	d = 0;
	for (int i = 0; i < 10; i++) {
		for (int j = 0; j < 10; j++) {
			if (s[i][j] == '#') {
				a = min(i + 1, a);
				b = max(i + 1, b);
				c = min(j + 1, c);
				d = max(j + 1, d);
			}
		}
	}

	cout << a << " " << b << endl;
	cout << c << " " << d << endl;

	return 0;
}

入力全体を2次元配列として扱います。問題文を読み取ると、以下の操作をすればよいことが分かります。

  • 以下は、1を起点として考える。配列は0を起点としているため注意が必要
  • # が存在する行の最小値をAとする。
  • # が存在する行の最大値をBとする。
  • # が存在する列の最小値をCとする。
  • # が存在する列の最大値をDとする。

問題に従い、AとB、CとDの2行に分けて解答を出力しています。このプログラムは、AC(Accepted=正しいプログラム)と判定されました。

Python プログラム例(ABC269B)

Python でも書いてみました。基本的には、C++ をそのまま Python に落とし込んだようなプログラムになっています。これが Python らしいプログラムかは、まだ判断ができません。まず Python で書く量を増やしていきます。

文字列を10行読むために内包記法を使いました。

"""AtCoder Beginner Contest 269 B"""
s = [input() for i in range(10)]
a, b, c, d = 11, 0, 11, 0
for i in range(10):
    for j in range(10):
        if s[i][j] == "#":
            a, b = min(i + 1, a), max(i + 1, b)
            c, d = min(j + 1, c), max(j + 1, d)
print(a, b)
print(c, d)

Python 版も「AC」と判定されました。

最後に

AtCoder を使って Python を書く量を増やそうと考えています。B問題については、少し考える要素があります。入出力を覚えた人が挑戦する問題としてよいかもしれません。

引き続き ABC の問題を紹介していきます。

COMMENT

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

CAPTCHA