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