AtCoder が提供しているABC(AtCoder Beginner Contest)366 B問題をC++とPythonで解いてみました。ABC366は、2024年8月10日21:00に実施されました。
AtCoder の紹介はこちらに、プログラミングの方針はこちらに記事があります。
B問題 Vertical Writing(Difficulty : 180)
問題の詳細は、リンク先をご覧ください。
行列を回転する問題です。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 の問題を紹介していきます。