AIZU ONLINE JUDGE

AOJ ITP1 9_D(Transformation)を解く

AOJ_ITP1_9_D

Aizu Online Judge(AOJ)が提供している「プログラミング入門」(ITP1)の9_D問題をC++とPython で解いてみました。

ITP1 のトピック9では、文字列について学びます。「文字列処理の基礎を学習します。」とあります。この学習コースを通じて、Python に慣れていきたいと考えています。

問題(9_D: Transformation)

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

AOJ ITP1 9_D問題:Transformation

与えられた命令に従い、文字列の一部を逆にしたり、置き換えていきます。

解答案

C++ プログラム例(ITP1 9_D)

問題文に記載されている命令は、インデックス(場所)で記載されています。一方、文字列を切り出す substr 関数の第2引数は、切り出す長さを指定します。このため、0 文字目からカウントして、a 文字目から b 文字目を切り出すには、以下となります。

str.substr(a, b – a + 1)

a 文字目から b 文字目の長さは、b – a ではなく、b – a + 1 文字あることに注意が必要です。

それぞれの命令で行うことをまとめておきます。

  • print: a 文字目から b 文字目を切り出して、出力する。
  • reverse: a 文字目から b 文字目を切り出して逆順にして、元の文字列と連結する。
  • replace: 文字列 p を読み込み、元の文字列と連結する。

解答案の C++ プログラムは以下となります。

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

int main()
{
	string str;
	cin >> str;
	int q;
	cin >> q;

	for (int i = 0; i < q; ++i) {
		string op;
		cin >> op;
		int a, b;
		cin >> a >> b;

		if (op == "print") {
			cout << str.substr(a, b - a + 1) << endl;
		} else if (op == "reverse") {
			string t = str.substr(a, b - a + 1);
			reverse(t.begin(), t.end());
			str = str.substr(0, a) + t + str.substr(b + 1);
		} else if (op == "replace") {
			string p;
			cin >> p;
			str = str.substr(0, a) + p + str.substr(b + 1);
		} else {
			// Not reached
		}
	}

	return 0;
}

Python プログラム例(ITP1 9_D)

Python では、substr の代わりにスライス記法を使います。文字列を逆順にするために、reversed する必要があります。これは、Python の文字列は、書き換えができないため、reverse が用意されていないためです。この結果を join しています。

変数名は、str が予約されているため、単純に s としました。

以下が、Python 版となります。

s = input()
q = int(input())
for i in range(q):
    query = input().split()
    op = query[0]
    a = int(query[1])
    b = int(query[2])
    if op == "print":
        print(s[a:b + 1])
    elif op == "reverse":
        t = "".join(list(reversed(s[a:b + 1])))
        s = s[0:a] + t + s[b+1:]
    elif op == "replace":
        p = query[3]
        s = s[0:a] + p + s[b+1:]

上記プログラムは、すべて AOJ で「AC(Accepted=正解)」と判定されます。

最後に

トピック9では、文字列について学びました。わたしが一番慣れているのは、C ですが、C++ と Python のどちらも文字列をサポートする機能が多いことを再認識しました。

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

COMMENT

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

CAPTCHA