Official

A - "atcoder".substr() Editorial by physics0523


プログラミングの学習 / AtCoder を始めたばかりの方へ

プログラミングの学習を始めたばかりで何から手をつけるべきかわからない方は、まずは practice contest の問題A「Welcome to AtCoder」をお試しください。言語ごとに解答例が掲載されています。

また、プログラミングコンテストの問題に慣れていない方は、 AtCoder Beginners Selection の問題をいくつか試すことをおすすめします。

C++入門 AtCoder Programming Guide for beginners (APG4b) は、競技プログラマー向けのC++入門用コンテンツです。 また、プログラミングコンテストに慣れてきた方向けに、以下のコンテンツも常設されています。

競プロ典型 90 問 では、プログラミングコンテストで扱われる典型的な 90 問の問題に挑戦可能です。

AtCoder Library Practice Contest では、AtCoderで使用可能な発展的なアルゴリズム等を取り扱うライブラリである AtCoder Library を使う練習をすることができます。


解法1. 7個の if 文で解く方法

例えば、 \(L \le 4 \le R\) であれば、 atcoder のうち \(4\) 文字目である o を出力する必要があります。
これと同様の考えを続けて \(7\) 個の if 文を用いてこの問題に正解できます。

実装例(C++):

#include<bits/stdc++.h>

using namespace std;

int main(){
  int l,r;
  cin >> l >> r;
  if(l<=1 && 1<=r){cout << 'a';}
  if(l<=2 && 2<=r){cout << 't';}
  if(l<=3 && 3<=r){cout << 'c';}
  if(l<=4 && 4<=r){cout << 'o';}
  if(l<=5 && 5<=r){cout << 'd';}
  if(l<=6 && 6<=r){cout << 'e';}
  if(l<=7 && 7<=r){cout << 'r';}
  return 0;
}

解法2. 解法1にループを導入する

先ほどの \(7\) つの if 文を ループでまとめて取り扱うことを考えます。
\(S=\)atcoder と定義して、 \(L \le i \le R\) なら \(S\)\(i\) 文字目を出力することを \(i\) が小さい方から繰り返せばよいです。
言語によっては文字列の先頭が \(0\) 文字目であったり \(1\) 文字目であったりする点に注意してください。例えば C++ の string 型は先頭が \(0\) 文字目です。

実装例(C++):

#include<bits/stdc++.h>

using namespace std;

int main(){
  int l,r;
  cin >> l >> r;
  string s="atcoder";
  for(int i=1;i<=7;i++){
    if(l<=i && i<=r){cout << s[i-1];}
  }
  cout << "\n";
  return 0;
}

解法3. ループを \(L\) 文字目から \(R\) 文字目まで回す

\(L\) 文字目から \(R\) 文字目まで回すようなループを使って以下のように出力することもできます。
実装例(C++):

#include<bits/stdc++.h>

using namespace std;

int main(){
  int l,r;
  cin >> l >> r;
  string s="atcoder";
  for(int i=l;i<=r;i++){
    cout << s[i-1];
  }
  cout << "\n";
  return 0;
}

解法4. substr 等の文字列を取り扱う機能を活用する

C++ の string 型には substr という機能があります。
(string 型の変数).substr(\(x\),\(y\)) とすることで、先頭から \(x\) 文字目を始点として \(y\) 文字の部分文字列を取り出すことができます。
再度になりますが、 C++ では string 型の先頭の文字は \(0\) 文字目であることに注意してください。

実装例1(C++):

#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) << "\n";
  return 0;
}

実装例2(C++):

#include<bits/stdc++.h>

using namespace std;

int main(){
  int l,r;
  cin >> l >> r;
  cout << ((string)"atcoder").substr(l-1,r-l+1) << "\n";
  return 0;
}

posted:
last update: