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

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

AtCoder ABC 264 A - "atcoder".substr() (8Q, 灰色, 100 点)

文字列の部分文字列を取得する関数 substr() (C++) を用いるか、for 文で書こう。

問題概要

文字列 "atcoder" について、 L 文字目から  R 文字目までを出力せよ。

制約

  •  1 \le L \le R \le 7

解法 (1):関数 substr() を使う。

文字列 S に対して、

S.substr(i, l)

は、文字列 S i 番目の文字 S[i] から開始して  l 文字分を取得する処理を表す。たとえば、S = "atcoder" として、

  • S.substr(0, 2) = "at"
  • S.substr(1, 3) = "tco"
  • S.substr(4, 1) = "d"

である。(ただし、 i 番目の文字から見て  l 文字分存在しない場合は、終端までの文字を取得する)。

今回の問題設定に戻ろう。取得したい部分文字列の長さは  R - L + 1 であることに注意しよう。よって、求める文字列は、S = "atcoder" として、

S.substr(L - 1, R - L + 1)

と表せる。なお、ここで、C++ では通常 0-indexed で考えるため、 L 文字目は S[L - 1] であることに注意しよう。

コード

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

int main() {
    int L, R;
    cin >> L >> R;
    
    string S = "atcoder";
    cout << S.substr(L - 1, R - L + 1) << endl;
}

 

解法 (2):for 文を用いる

for 文を用いて、文字列  S = "atcoder" の  L 文字目から  R 文字目までを出力してもよい。

コード

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

int main() {
    int L, R;
    cin >> L >> R;
    
    string S = "atcoder";
    for (int i = L - 1; i <= R - 1; ++i) cout << S[i];
    cout << endl;
}