AtCoder

ABC366 B問題(Vertical Writing)を解く

AtCoder_ABC366_B

AtCoder が提供しているABC(AtCoder Beginner Contest)366 B問題をC++とPythonで解いてみました。ABC366は、2024年8月10日21:00に実施されました。

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

B問題 Vertical Writing(Difficulty : 180)

問題の詳細は、リンク先をご覧ください。

ABC366 B問題 Vertical Writing

行列を回転する問題です。AtCoder Problems による Difficulty は 180 でした。

解答案

ABC298B問題解説記事)の問題文に回転する方法の記述があります。具体的には、以下となります。

$0 \leqq i, j < N$ を満たす $(i, j)$ に対して、同時に $A_{i,j}$ を $A_{N – 1 – j, i}$ で置き換える。

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

読み込んだ文字列の最大の長さを m とします。それぞれの文字列 s[i] の長さを m に合わせるために末尾に “*” を付けたします(14ー18行目)。

回転の式に従い、文字列 t を計算します(30行目)。文字列 t[i] の末尾にある “*” を取り除きます(34ー38行目)。

以下が、C++プログラムです。

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

int main()
{
	int n;
	cin >> n;
	vector<string> s(n);
	int m = 0;
	for (int i = 0; i < n; ++i) {
		cin >> s[i];
		m = max(m, (int)s[i].length());
	}
	for (int i = 0; i < n; ++i) {
		while (s[i].length() < m) {
			s[i] += '*';
		}
	}

	vector<string> t(m);
	for (int i = 0; i < n; ++i) {
		t[0] += '*';
	}
	for (int i = 1; i < m; ++i) {
		t[i] = t[0];
	}

	for (int i = 0; i < m; ++i) {
		for (int j = 0; j < n; ++j) {
			t[i][j] = s[n - 1 - j][i];
		}
	}

	for (int i = 0; i < m; ++i) {
		while (t[i][t[i].length() - 1] == '*') {
			t[i].pop_back();
		}
	}

	for (int i = 0; i < m; ++i) {
		cout << t[i] << endl;
	}

	return 0;
}

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

Python プログラム例(ABC366B)

Python版も基本的な考え方は同じです。以下がプログラムです。

"""AtCoder Beginner Contest 366 B"""
n = int(input())
s = [input() for i in range(n)]
m = 0
for i in range(n):
    m = max(m, len(s[i]))
for i in range(n):
    while len(s[i]) < m:
        s[i] += '*'

t = [["*" for _ in range(n)] for _ in range(m)]
for i in range(m):
    for j in range(n):
        t[i][j] = s[n - 1 - j][i]

for i in range(m):
    while t[i][-1] == '*':
        t[i].pop()

for i in range(m):
    print(*t[i], sep="")

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

最後に

回転についてのコードを整理していないと、この難易度の問題も実装に時間がかかると思います。

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

COMMENT

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

CAPTCHA