ITP1_9_D 文字列変換をC++で解いてみた[AIZU ONLINE JUDGE]

AIZU ONLINE JUDGE

こんにちは! mnbd(@mnbbbbbd)です。

AIZU ONLINE JUDGEの「ITP1_9_D 文字列変換」を解いてみましたので、その回答と解説をご紹介いたします。

プログラミング初心者なので、もっといい回答があるに違いありません。

あくまでも「動作はする」サンプルとしてご覧ください。

問題文

文字列 strstr に対して、与えられた命令の列を実行するプログラムを作成してください。命令は以下の操作のいずれかです:

・print a b: strstr の a 文字目から b 文字目までを出力する。
・reverse a b: strstr の a 文字目から b 文字目までを逆順にする。
・replace a b p: strstr の a 文字目から b 文字目までを p に置き換える。

ここでは、文字列 strstr の最初の文字を 0 文字目とします。

Input

1 行目に文字列 strstr が与えられます。strstr は英小文字のみ含みます。2 行目に命令の数 qq が与えられます。続く qq 行に各命令が上記の形式で与えられます。

Output

各 print 命令ごとに文字列を1行に出力してください。

Constraints

・1≤strの長さ≤1000
・1≤q≤100
・0≤a≤b<strの長さ
・replace 命令では b−a+1=pの長さ

https://onlinejudge.u-aizu.ac.jp/courses/lesson/2/ITP1/9/ITP1_9_D

回答

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

string replace(string str, int a, int b, string p) {
    int j = 0;
    for(int i = a; i <= b; i++) {
        str[i] = p[j];
        j++;
    }
    return str;
}

string reverse(string str, int a, int b) {
    string tmp = str;
    int j = a;
    for(int i = b; i >= a; i--) {
        str[j] = tmp[i];
        j++;
    }
    return str;
}

string print(string str, int a, int b) {
    string tmp;
    int j = 0;
    for(int i = a; i <= b; i++) {
        tmp += str[i];
        j++;
    }
    return tmp;
}

int main() {
    string str;
    cin >> str;
    int n;
    cin >> n;
    string method_string, p;
    int a, b;
    string ans[n];
    int j = 0;
    for(int i = 0; i < n; i++) {
        cin >> method_string;
        if(method_string == "replace") {
            cin >> a >> b >> p;
            str = replace(str, a, b, p);
        } else if(method_string == "reverse") {
            cin >> a >> b;
            str = reverse(str, a, b);
        } else {
            cin >> a >> b;
            ans[j] = print(str, a, b);
            j++;
        }
    }

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

    return 0;
}

解説

3つの命令文をmain関数に書くと長いので、別々にprint、reverse、replaceと分けました。

引数でそのまま入力で受け取ったものを渡し、それぞれ処理したものをstring型の返り値としています。

printだけ後でまとめて出力する必要がありますので、stringの配列に文字列を格納しています。

ハマったポイント

ハマったポイントはありませんでした。

ただ、私の今回の書き方ですと、命令を一行ずつ読み込んで処理するので、printの命令を後で出力するのに配列に格納しなければならないことがわかってませんでした。

ループの中でprintを受け取った時点で出力してしまうと、実行した際に入力の後に出力がすぐに来てしまい、思った回答が得られなくなります。

まとめ

AIZU ONLINE JUDGEの「ITP1_9_D 文字列変換」を解いてみましたので、その回答と解説をご紹介いたしました。

少しずつですが、プログラミングの勉強をしています。
まだ初心者ですが、よかったらつながっていただけると嬉しいです。
Twitterアカウント(@mnbbbbbd

以上です。
読んでいただきありがとうございました!

タイトルとURLをコピーしました