AtCoder が提供しているABC(AtCoder Beginner Contest)303 のA問題をC++とPythonで解いてみました。ABC303は、2023年5月27日21:00に実施されました。
AtCoder の紹介はこちらに、プログラミングの方針はこちらに記事があります。
A問題 Similar String(Difficulty : 22)
問題はリンク先をご覧ください。
2つの文字列を比較する問題です。AtCoder Problems による Difficulty は 22 でした。
解答案
C++ プログラム例(ABC303A)
問題にある条件をそのまま実装しました。
- 「x と y は同じ文字」は、そのまま条件式になります(13行目)。
- 「x と y の片方が 1 で、もう片方が l」は、2つの条件式になります(16、19行目)。
- 「x と y の片方が 0 で、もう片方が o」は、2つの条件式になります(22、25行目)。
5つの条件を確認して、解答を求めました。以下が、C++プログラムとなります。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin >> n;
string s, t;
cin >> s >> t;
bool result = true;
for (int i = 0; i < n; ++i) {
if (s[i] == t[i]) {
continue;
}
if ((s[i] == 'l')&&(t[i] == '1')) {
continue;
}
if ((s[i] == '1')&&(t[i] == 'l')) {
continue;
}
if ((s[i] == 'o')&&(t[i] == '0')) {
continue;
}
if ((s[i] == '0')&&(t[i] == 'o')) {
continue;
}
result = false;
}
if (result) {
cout << "Yes" << endl;
} else {
cout << "No" << endl;
}
return 0;
}
AC(Accepted=正しいプログラム)と判定されました。
Python プログラム例(ABC303A)
Python 版も丁寧に5つの条件を記載しました。
"""AtCoder Beginner Contest 303 A"""
n = int(input())
s = input()
t = input()
result = True
for i in range(n):
if s[i] == t[i]:
continue
if s[i] == 'l' and t[i] == '1':
continue
if s[i] == '1' and t[i] == 'l':
continue
if s[i] == 'o' and t[i] == '0':
continue
if s[i] == '0' and t[i] == 'o':
continue
result = False
print("Yes" if result else "No")
こちらも「AC」と判定されました。
最後に
この問題で似た文字として扱われている ‘1’ と ‘l’ は、フォントによっては非常に似ているため、プログラムでは、単独で小文字の ‘l’ を使わないようにしています(使う場合には、’L’ にしています)。問題は小文字の ‘o’ でしたが、大文字の ‘O’ と ’0’ も似ているため実際のプログラムでは注意が必要です。
引き続き ABC の問題を紹介していきます。