Official

A - Stage Clear Editorial by MMNMM


初心者の方へ

この問題では、主に

  • 現在のステージがどのワールドのいくつめのステージであるかの情報を入力から得る
  • 次のステージがどのワールドのいくつめのステージであるかを(適切な条件分岐を行って)求める

の \(2\) つの処理を実装することが求められます。

前者はいくつか方針があります。 例えば、以下のような方針で入力からワールド・ステージの情報を整数として得ることができます。

  • 入力全体を文字列として受け取り、先頭と末尾の文字を数として解釈する:\(3\) 文字の文字列を入力から受け取ること、文字列の特定の文字を取得すること、文字が表す数を得ることの \(3\) つができれば実行でき、非常に多くの言語で可能な方針です。
  • 入力の形式を与えられるような入力方法を使う:C や C++ で使える scanf 関数などは、空白区切りでない場合にも入力の形式を正しく与えれば整数や浮動小数点数などを入力から読み取ることができます。今回の場合は、scanf("%d-%d", &a, &b) のようにすることで、変数 a, b にほしい値を入力することができます。
  • 解釈できるところまで読むような入力方法を使う:C++ の std::cin などでは、整数を入力する場合には整数として解釈できるところまで入力を読み、整数として解釈できない入力に出会ったらそれを消費せずにそこまでの入力から値を決定します。そのため、例えば入力が 4-2 の状態から整数を入力しようとした場合、4 を読んで \(4\) を返し、消費されていない入力として -2 が残ります。ここからさらに文字を \(1\) 文字読んで、そのあと再び整数を入力することで欲しい値を得ることができます。もしくは、少しトリッキーなコードになりますが、入力から整数を連続して \(2\) つ得ようとした場合には \(2\) つめの整数が欲しい値の \(-1\) 倍になるため、ここから処理を行ってもこの問題を解くことができます。

後者については、if 文を適切に用いることで解くことができます。

実装例は以下のようになります。 以下では、Python と C++ でそれぞれいくつかの実装方針で実装例を示します。

s = input()
a = int(s[0]) # 最初の文字を数字として解釈する
b = int(s[2]) # 最後の文字を数字として解釈する

if b == 8: # ワールドの最後のステージなら
    print(str(a + 1) + '-1') # 次のワールドの最初のステージ
else: # そうでなければ
    print(str(a) + '-' + str(b + 1)) # 同じワールドの次のステージ
a, b = map(int, input().split('-')) # 入力を文字 `-` で分割し、それぞれを整数として解釈する

b += 1 # ステージを進めてみて
if b > 8: # ステージ 8 を越えていたら
    a += 1 # ワールドを進めて
    b = 1 # ステージを戻す

print(str(a) + '-' + str(b))
#include <iostream>
using namespace std;

int main() {
    string S;
    cin >> S;
    if (S[2] == '8') { // 最後の文字が 8 なら
        S[0] += 1; // 最初の文字を 1 だけ大きくする
        S[2] = '1'; // 最後の文字は 1 にする
    } else { // そうでなければ
        S[2] += 1; // 最後の文字を 1 だけ大きくする
    }
    cout << S << endl;
}
#include <cstdio>
using namespace std;

int main() {
    int a, b;
    scanf("%d-%d", &a, &b); // 標準入力から形式を指定して整数を 2 つ読み込む
    ++b; // ステージを進めてみて
    if (b > 8) { // ステージ 8 を越えていたら
        ++a; // ワールドを進めて
        b = 1; // ステージを戻す
    }
    printf("%d-%d\n", a, b); // 形式を指定して出力する
    return 0;
}

posted:
last update: