けんちょんの競プロ精進記録

競プロの精進記録や小ネタを書いていきます

JOI 一次予選 2023 (第 1 回) C - 3 つの箱 (7Q, 難易度 2)

問題文に言われた通りにシミュレーションする問題!

問題概要

長さ  N の文字列  S があって、各文字は 'L' または 'R' である。

また、1 つのボールと、ボールを入れることができる箱  1, 2, 3 があって、最初ボールは箱 1 に入っている。文字列  S の文字を順に見ていき、各文字に応じて次のように処理する。

  • 'L' のとき:箱の数値が 1 小さいところにボールを移す (もともと箱 1 に入っているときは箱 1 のまま)
  • 'R' のとき:箱の数値が 1 大きいところにボールを移す (もともと箱 3 に入っているときは箱 3 のまま)

 N 回の処理を終えたあとの、ボールの入っている箱の番号を答えよ。

解法

問題文に書かれた通りの操作を実行しよう!

文字列  S の文字を順に見ていくのは for 文で次のように実装できる。

for (int i = 0; i < S; ++i) {
    if (S[i] == 'L') {
        // ボールを左に動かす

    } else {
        // ボールを右に動かす

    }
}

また、ボールを左に動かす処理は次のように書ける。なお、動かす前にボールの入っている箱の番号を  x とする。

x = max(x - 1, 1);

これは、次の意味を持つ。基本的には xx - 1 に変えたいのだが、0 になってしまう場合は 1 のままにするので、max(x - 1, 1) に置き換えている。

ボールを右に動かす処理も同様に書ける。

コード

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

int main() {
    int N;
    string S;
    cin >> N >> S;
    int x = 1, res = 0;
    for (int i = 0; i < N; ++i) {
        if (S[i] == 'L') {
            x = max(x - 1, 1);
        } else {
            x = min(x + 1, 3);
        }
        
        if (x == 3) {
            ++res;
        }
    }
    cout << res << endl;
}