こんにちは! mnbd(@mnbbbbbd)です。
AIZU ONLINE JUDGEの「ITP1_9_B シャッフル」を解いてみましたので、その回答と解説をご紹介いたします。
プログラミング初心者なので、もっといい回答があるに違いありません。
あくまでも「動作はする」サンプルとしてご覧ください。
問題文
1つのアルファベットが描かれた n 枚のカードの山をシャッフルします。
1回のシャッフルでは、下から h 枚のカードをまとめて取り出し、それを残ったカードの山の上に積み上げます。
カードの山は以下のように1つの文字列で与えられます。
abcdeefab
最初の文字が一番下にあるカード、最後の文字が一番上にあるカードを示しています。
例えば、これを h が 4 でシャッフルすると、最初の4文字 abcd が、残りの文字 eefab の末尾へ連結されるので以下のようになります:
eefababcd
このシャッフルを何回か繰り返します。
カードの山の最初の並び(文字列)と h の列を読み込み、最後の並び(文字列)を出力するプログラムを作成して下さい。
Input
複数のデータセットが入力として与えられます。各データセットは以下の形式で与えられます:
最初の並びを表す文字列
シャッフル回数m
h1
h2
・
・
hm最初の並びを表す文字列が “-” のとき入力の終わりとします。
Constraints
1 ≤ 文字列の長さ≤ 200
1 ≤ m ≤ 100
1 ≤ hi < 文字列の長さ
データセットの数は10を超えないOutput
各データセットに対して、最後の並び(文字列)を1行に出力して下さい。
https://onlinejudge.u-aizu.ac.jp/courses/lesson/2/ITP1/9/ITP1_9_B
回答
#include <bits/stdc++.h>
using namespace std;
int main() {
string str;
string ans[10];
int i = 0;
while(cin >> str) {
if(str[0] == '-') {
break;
}
queue<char> q;
for(int i = 0; i < str.size(); i++) {
q.push(str[i]);
}
int m;
cin >> m;
for(int i = 0; i < m; i++) {
int h;
cin >> h;
for(int j = 0; j < h; j++) {
char c = q.front();
q.pop();
q.push(c);
}
}
string tmp_str;
while(!q.empty()) {
tmp_str += q.front();
q.pop();
}
ans[i] = tmp_str;
i++;
}
for(int j = 0; j < i; j++) {
cout << ans[j] << endl;
}
return 0;
}
解説
問題の文字列の処理が最初から取り出して、最後尾に追加するものでしたので、キューを使っています。
キューに入力で受け取った文字列を格納して、それぞれ指定番号の値を取り出し、要素を削除してから追加してます。
複数のデータセットの入力を受け取らなければならないので、string型の配列に格納し、それらを最後に出力しています。
ハマったポイント
キューを使ってしまったためにハマったポイントはありませんでした。
ただ、本来であればデータ構造から書くべきなのかもしれません。
学んだこと
キューは知っていましたが、使ったことがありませんでした。
ループしてキュー内の値を取得する方法が配列と違うので注意が必要だと思いました。
まとめ
AIZU ONLINE JUDGEの「ITP1_9_B シャッフル」を解いてみましたので、その回答と解説をご紹介いたしました。
少しずつですが、プログラミングの勉強をしています。
まだ初心者ですが、よかったらつながっていただけると嬉しいです。
Twitterアカウント(@mnbbbbbd)
以上です。
読んでいただきありがとうございました!