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

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

JOI 一次予選 2020 (第 3 回) B - キャピタリゼーション (7Q, 難易度 2)

for 文で隣接する要素を見ながら処理していく系の問題

問題概要

長さ  N の文字列  S が与えられる。

 S を左から見ていき、文字列 "joi" が含まれるならば、これを "JOI" に変換していく処理を繰り返す。操作後の文字列を出力せよ。

解法

次のように考えるとよいでしょう。 S i = 0, 1, 2, \dots 文字目を順に見ていき、もし

  •  S i 文字目が 'j'
  •  S i + 1 文字目が 'o'
  •  S i + 2 文字目が 'i'

であるならば、これらをそれぞれ 'J', 'O', 'I' にしていきます。

コード

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

int main() {
    int N;
    string S;
    cin >> N >> S;

    for (int i = 0; i + 2 < N; ++i) {
        if (S[i] == 'j' && S[i+1] == 'o' && S[i+2] == 'i') {
            S[i] = 'J';
            S[i+1] = 'O';
            S[i+2] = 'I';
        }
    }
    cout << S << endl;
}