{ }codelper
목록 자르기나머지P0032

목록 오른쪽으로 돌리기

첫 줄에 정수의 개수 n과 돌릴 횟수 k, 둘째 줄에 정수 n개가 주어진다.
목록을 오른쪽으로 k칸 돌린 결과를 빈칸 하나로 띄워 한 줄에 출력하라.
한 칸 돌리면 맨 끝의 값이 맨 앞으로 온다(1 2 3 4 5를 2칸 돌리면 4 5 1 2 3).
k는 n보다 클 수 있고, n칸 돌리면 처음과 같아진다.

입력
1 ≤ n ≤ 100, 0 ≤ k ≤ 1,000,000,000, -1000 ≤ 각 정수 ≤ 1000
출력
돌린 목록 한 줄
예시 1 · stdin
5 2
1 2 3 4 5
stdout
4 5 1 2 3
예시 2 · stdin
5 7
1 2 3 4 5
stdout
4 5 1 2 3
main.py
입력(stdin)

실행하면 이 줄들이 차례로 input()·표준 입력으로 들어가요(실행 중에 묻지 않아요).

$ 준비됐어요

코드를 입력해 풀려면 PC에서 열어 주세요. 모바일에서는 문제와 풀이를 볼 수 있어요.

다른 언어로는?언어별 풀이 보기 · 8개 언어 풀이

먼저 k %= n으로 줄여요.
한 칸씩 k번 돌리면 k = 10억에서 너무 느리고, 줄이지 않고 Python a[-k:] + a[:-k]를 쓰면 k > n일 때 a[-k:]가 목록 전체가 되어 그대로 나와요.
자르기: Python a[n-k:] + a[:n-k], JS a.slice(n - k), C# a[(n-k)..], C++ std::rotate, 크레이콘 a.부분목록(n - k, k).
자리 계산 (i - k + n) % n에서 + n을 빼면 C·C++·Java·C#·JS는 -1 % 5가 -1이라 배열 밖을 읽어요(Python만 4).

Pythonmain.py · 4 줄
n, k = map(int, input().split())a = input().split()k %= nprint(" ".join(a[n - k:] + a[:n - k]))
JavaScriptmain.js · 5 줄
const [first, second] = require("fs").readFileSync(0, "utf8").split("\n");const [n, k0] = first.trim().split(/\s+/).map(Number);const a = second.trim().split(/\s+/);const k = k0 % n;console.log([...a.slice(n - k), ...a.slice(0, n - k)].join(" "));
TypeScriptmain.ts · 6 줄
import { readFileSync } from "node:fs";const [first, second] = readFileSync(0, "utf8").split("\n");const [n, k0]: number[] = first.trim().split(/\s+/).map(Number);const a: string[] = second.trim().split(/\s+/);const k: number = k0 % n;console.log([...a.slice(n - k), ...a.slice(0, n - k)].join(" "));
JavaMain.java · 15 줄
import java.util.Scanner;import java.util.StringJoiner; public class Main {    public static void main(String[] args) {        Scanner sc = new Scanner(System.in);        int n = sc.nextInt();        int k = sc.nextInt() % n;        int[] a = new int[n];        for (int i = 0; i < n; i++) a[i] = sc.nextInt();        StringJoiner out = new StringJoiner(" ");        for (int i = 0; i < n; i++) out.add(String.valueOf(a[(i - k + n) % n]));        System.out.println(out);    }}
C#Main.cs · 13 줄
using System;using System.Linq; class Program{    static void Main()    {        int[] nk = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries).Select(int.Parse).ToArray();        int n = nk[0], k = nk[1] % n;        string[] a = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries);        Console.WriteLine(string.Join(" ", a[(n - k)..].Concat(a[..(n - k)])));    }}
C++main.cpp · 13 줄
#include <algorithm>#include <iostream>#include <vector> int main() {    int n, k;    std::cin >> n >> k;    std::vector<int> a(n);    for (int& x : a) std::cin >> x;    std::rotate(a.begin(), a.end() - k % n, a.end());    for (int i = 0; i < n; i++) std::cout << (i ? " " : "") << a[i];    std::cout << "\n";}
Cmain.c · 14 줄
#include <stdio.h> int main(void) {    int n, k, a[100];    scanf("%d %d", &n, &k);    for (int i = 0; i < n; i++) scanf("%d", &a[i]);    k %= n;    for (int i = 0; i < n; i++) {        if (i > 0) putchar(' ');        printf("%d", a[(i - k + n) % n]);    }    putchar('\n');    return 0;}
Craykonmain.cray · 10 줄
nk = 콘솔.수들읽기();n = nk[0];k = nk[1] % n;a = 콘솔.수들읽기();result = a.부분목록(n - k, k);각각 (x 에서 a.부분목록(0, n - k)){    result.넣기(x);}콘솔.쓰기(result);