Official

A - Shift Editorial by Nyaan


AtCoder をはじめたばかりで何をしたらよいか分からない方は、まずは practice contest の問題A「Welcome to AtCoder」を解いてみてください。基本的な入出力の方法が載っています。
また、プログラミングコンテストの問題に慣れていない方は、AtCoder Beginners Selection の問題をいくつか解いてみることをおすすめします。


この問題は for-loop を上手く使えるかをテーマとした問題です。

まず、数列 \(A = (A_1, A_2, \dots, A_N)\) に対して操作を行う方法を考えてみましょう。これは色々な方法がありますが、次の一連の手順で \(A\) を更新するのが一番素朴な方法だと思います。

  • \(A_i\) の値を \(A_{i + 1}\) に更新する」という操作を \(i = 1, 2, \dots, N-1\) の順番に行う。(この部分は \(i\) を変数とする for-loop で実装できる。)
  • \(A_N\) の値を \(0\) に更新する。

このような操作を \(K\) 回行うプログラムを書けばよく、この「\(K\) 回行う」という部分も for-loop を利用して同じ操作を \(K\) 回実行するようにすればよいです。

C++ による実装例は次の通りです。

#include <iostream>
using namespace std;

int N, K, A[101];

int main() {
  cin >> N >> K;
  for (int i = 1; i <= N; i++) {
    cin >> A[i];
  }
  for (int loop = 1; loop <= K; loop++) {
    for (int i = 1; i <= N - 1; i++) {
      A[i] = A[i + 1];
    }
    A[N] = 0;
  }
  for (int i = 1; i <= N; i++) {
    cout << A[i] << (i == N ? "\n" : " ");
  }
}

また、Python での実装例は次の通りです。Python では列のスライスという機能を利用すれば、操作の部分のコードを少しだけ簡潔に書くことができます。

N, K = map(int, input().split())
A = list(map(int, input().split()))
for i in range(K):
  A = A[1:] + [0]
print(*A)

posted:
last update: