yutasの競技プログラミング勉強帖

競技プログラミングの問題についての解説記事を主に書いています。

A - Spread / AtCoder Beginner Contest 329

問題

英大文字からなる文字列  s が与えられる。  s の各文字を空白で区切り、1文字ずつ出力せよ。

入力

1行目に、文字列  s が与えられる。

条件

  •  2 \leq |s| \leq 100
  •  s は英大文字のみで構成される。

出力

答えとなる文字列を1行で出力すること。

解法

 s 1 文字目と  2 文字目の間に を、 2 文字目と  3 文字目の間に を、というようにして順に文字を出力していけば、答えとなる文字列が出力できます。

このときに、文字列  s の長さを  n とすると、 (n-1) 文字目と  n 文字目の間で を、というところで終了することに気をつける必要があります。 というのも、単純に  n 回分のforループを回してしまうと、 n 文字目の後に空白スペースが生まれてしまい、答えとなる文字列と異なるものになってしまうからです。

ソースコード

以下のようにして、main() 関数の中に直接実装しました。

int main() {
  string s;
  cin >> s; // 文字列 s の入力を行う

  int n = s.length(); // 文字列 s の長さ n を出す

  // string が 0-indexであることに気をつけて、forループを記述する
  for (int i = 0; i < n; i++) {
    cout << s[i]; // まずは s[i] を出力する
    if (i == n - 1) {
      cout << endl; // 最後の文字であった場合は改行する
    } else {
      cout << " "; // 最後の文字でない場合は、空白を出力する
    }
  }

  return 0;
}

感想

前にAtCoderの問題について記事を書いたのはABC180*1だったんですね…。 おそらく当時の最新ではないと思いますが、この間にコンテスト数が150個もあったのはすごいですね。