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

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

JOIG 2021 B - 巻物 (AOJ 0702, 難易度 2)

文字列の処理を練習する問題ですね

問題概要

 N 文字の文字列  S が与えられます。 S は英文字のみからなります。

 S K 文字目以降について、

  • 大文字ならば小文字に
  • 小文字ならば大文字に

なるように変換してくだだい。

制約

  •  1 \le K \le N \le 100

考えたこと

この問題では、次のような処理をすればよいでしょう。

for (int i = K - 1; i < N; ++i) {
    S[i] を大文字・小文字を入れ替える
}

ここで、i = K から始めるのではなく、i = K - 1 から始めることに注意しましょう。 K は 1-indexed で与えられますが、プログラミングでは 0-indexed で考えることが多いからです。

大文字と小文字の変換方法

最後に、大文字と小文字の変換方法を考えましょう。最初に小文字を大文字に変換する方法を考えます。まず文字 c が小文字かどうかは

if (c >= 'a' && c <= 'z')

というようにして判定できます。その上で大文字にするためには

c += 'A' - 'a';

というようにすることが考えられます。大文字から小文字への変換も同様に行えます。

コード

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

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

    for (int i = K-1; i < N; ++i) {
        // 小文字を大文字に変換
        if (S[i] >= 'a' && S[i] <= 'z') {
            S[i] += 'A' - 'a';
        }
        // 大文字を小文字に変換
        else {
            S[i] -= 'A' - 'a';
        }
    }
    cout << S << endl;
}