AIZU ONLINE JUDGE

AOJ ITP1 9_B(Shuffle)を解く

AOJ_ITP1_9_B

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

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

問題(9_B: Shuffle)

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

AOJ ITP1 9_B問題:Shuffle

部分文字列を取り出すことを学びます。

解答案

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

C++ では、部分文字列を string クラスの substr メソッドで切り出します。以下の関数仕様については、cpprefjp を参考にしました。

string substr(size_type pos = 0, size_type n = npos)

引数

  • pos : 切り出す文字列の最初のインデックス
  • n : 切り出す文字の数、省略した場合は、文字列末まで切り出す

戻り値

  • 切り出した文字列(string クラス)

本体部分は、n 個の数を読み込み、問題に従い文字列を操作します。C++ の解答案は以下となります。

#include <iostream>
#include <string>

using namespace std;

int main()
{
	while (1) {
		string s;
		cin >> s;
		if (s == "-") {
			break;
		}
		int n;
		cin >> n;

		for (int i = 0; i < n; ++i) {
			int h;
			cin >> h;
			string s1, s2;
			s1 = s.substr(h);
			s2 = s.substr(0, h);
			s = s1 + s2;
		}
		cout << s << endl;
	}

	return 0;
}

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

Python は、リストに適用できるスライス記法を使います。

[lower_bound : upper_bound : stride]

  • lower_bound : 切り取りたい部分の開始インデックス
  • upper_bound : 切り取りたい部分の終わりを一つ越えたインデックス
  • stride : 何個毎に切り出すか指定する。

2番目と3番目は、省略可能です。2番目を省略すれば、リスト末まで切り出せます。3番目を省略すると 1 が指定されます。

while True:
    s = input()
    if s == "-":
        break
    n = int(input())
    for i in range(n):
        h = int(input())
        s = s[h:] + s[0:h]
    print(s)

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

最後に

部分文字列を切り出す方法を整理しました。C++ は、string クラスのメソッド substr を使いました。Python は、一般的なリストに適用できるスライス記法を使いました。

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

COMMENT

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

CAPTCHA