AtCoder が提供しているABC(AtCoder Beginner Contest)309 のA問題をC++とPythonで解いてみました。ABC309は、2023年7月8日21:00に実施されました。
AtCoder の紹介はこちらに、プログラミングの方針はこちらに記事があります。
A問題 Nine(Difficulty : 22)
問題はリンク先をご覧ください。
与えられた2つの数字が条件を満たすか判定する問題です。AtCoder Problems による Difficulty は 22 でした。
解答案
以下の3×3のグリッドが与えられています。2つの整数 $A$ と$B$($A < B$)が左右に隣接しているか判定します。
上記の画像は、問題文のページから借用しました。
C++ プログラム例(ABC309A)
同じ行にあるか判定するために $A$ と $B$ から1を引いて3で割った結果を比較します。同じ値となれば、同じ行になります(10行目)。
$A$ と $B$ が同じ行にある場合に、隣接しているか判定しています(11行目)。
以下が、C++プログラムとなります。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a, b;
cin >> a >> b;
bool result = false;
if ((a - 1) / 3 == (b - 1) / 3) {
if (a + 1 == b) {
result = true;
}
}
if (result) {
cout << "Yes" << endl;
} else {
cout << "No" << endl;
}
return 0;
}
もう少し条件を簡単にしてみます。
$A$ が3の倍数でなければ、$A + 1$ と $B$ が等しいときに $A$ と $B$ は隣接しています(10行目)。条件式が2つであるため、少しすっきりと書けています。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a, b;
cin >> a >> b;
bool result = false;
if ((a % 3 != 0)&&(a + 1 == b)) {
result = true;
}
if (result) {
cout << "Yes" << endl;
} else {
cout << "No" << endl;
}
return 0;
}
どちらも AC(Accepted=正しいプログラム)と判定されました。
Python プログラム例(ABC309A)
Python は入力(2行目)と出力(3行目)の2行でプログラムしました。3行目は、少しごちゃついています。判定する条件を変数にしても良いかもしれません。
"""AtCoder Beginner Contest 309 A"""
a, b = map(int, input().split())
print("Yes" if a % 3 != 0 and a + 1 == b else "No")
こちらも「AC」と判定されました。
最後に
左右だけではなく上下に隣接している場合も条件に加えて提出してWA(Wrong Answer)判定となりました。A問題でWA判定を始めてもらった気がします。Twitter でも同じ間違いをした人が何人か見つかりました。
5分ペナルティは大きいです。問題はきちんと読まないといけないですね。
引き続き ABC の問題を紹介していきます。