AtCoder

ABC333 B問題(Pentagon)を解く

AtCoder_ABC333_B

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

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

B問題 Pentagon(Difficulty : 89)

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

ABC333 B問題 Pentagon

線分の長さは2種類しかありません。それが一致しているか判定します。AtCoder Problems による Difficulty は 89 でした。

解答案

以下の五角形を考えます。この図は、問題文から引用させていただきました。

線分は、$_5C_2 = 10$ 種類しかありません。長さも以下の2種類しかありません。

  • 隣接する場合(文字コードの差の絶対値が1か4)
    AB、BC、CD、DE、EA
  • それ以外(文字コードの差の絶対値が2か3)
    AC、AD、BD、BE、CE

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

線分を、隣にあるか(Type = 1)、それ以外か(Type = 2)を判定して、一致しているか確認します。

以下が、C++プログラムとなります。

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

int main()
{
	string s1, s2;
	cin >> s1 >> s2;

	int type1 = 2;
	int diff1 = abs(s1[0] - s1[1]);
	if ((diff1 == 1)||(diff1 == 4)) {
		type1 = 1;
	}

	int type2 = 2;
	int diff2 = abs(s2[0] - s2[1]);
	if ((diff2 == 1)||(diff2 == 4)) {
		type2 = 1;
	}

	if (type1 == type2) {
		cout << "Yes" << endl;
	} else {
		cout << "No" << endl;
	}

	return 0;
}

AC(Accepted=正しいプログラム)と判定されました。

Python プログラム例(ABC333B)

Python 版も基本的な考え方は同じです。以下となります。

"""AtCoder Beginner Contest 333 B"""
s1 = input()
s2 = input()

type1 = 2
diff1 = abs(ord(s1[0]) - ord(s1[1]))
if diff1 in (1, 4):
    type1 = 1

type2 = 2
diff2 = abs(ord(s2[0]) - ord(s2[1]))
if diff2 in (1, 4):
    type2 = 1

print("Yes" if type1 == type2 else "No")

こちらも「AC」と判定されました。

最後に

実際のコンテストでは、一回の提出でACを取ることができました。ただし、ごちゃついたプログラムになっていました。ブログ記事のために見直し、分かりやすくなったと考えています。

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

COMMENT

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

CAPTCHA