문제 분류 수업 진도 대회 채점현황 순위 질문게시판
게임
스도쿠 타이핑 리듬 타자게임 타이핑 테트리스 타이핑 인베이더 타이핑 지뢰찾기 8192 공룡게임 타이핑 플래피버드 랭킹
로그인

3085 : 배열의 오른쪽 회전

•시간제한: 1.000 S •메모리제한: 256 MB •제출: 110 •통과: 41 •만든사람: suakii

3085 : 배열의 오른쪽 회전

시간 1.000s · 메모리 256MB · 제출 110 · 정답 41

문제 설명

$N$개의 숫자로 이루어진 배열이 주어집니다.

이 배열의 모든 원소를 오른쪽으로 $K$칸씩 밀어서 회전시키는 프로그램을 작성하세요. 배열의 맨 오른쪽 끝에 있던 원소는 밀려나면 다시 배열의 맨 왼쪽 처음으로 돌아옵니다.

회전 전 1 2 3 4 5 오른쪽 끝 2개 (K = 2) 오른쪽 2칸 이동 ➔ ↺ 맨 앞으로 돌아옴 회전 후 4 5 1 2 3 ▲ 맨 앞으로 이동 ▲ 2칸씩 밀려난 원소들

[제약 조건]
• $1 \le N \le 1000$
• $1 \le K \le 10000$
• 입력되는 모든 값은 정수

입력 설명

첫째 줄에 배열의 크기 $N$과 회전시킬 칸 수 $K$가 공백으로 구분되어 주어집니다.
둘째 줄에 배열의 원소 $N$개가 공백으로 구분되어 주어집니다.

출력 설명

오른쪽으로 $K$칸 회전된 배열의 원소들을 공백으로 구분하여 출력하세요.

입력 예시
COPY
복사되었습니다!

5 2
1 2 3 4 5

출력 예시
COPY
복사되었습니다!

4 5 1 2 3

도움

[도움말]
배열의 원소들을 오른쪽으로 밀 때 알아두면 좋은 핵심 팁입니다.

1. 회전 횟수 최적화 ($K \% N$)
• 배열의 길이가 $N$일 때, 오른쪽으로 $N$칸을 밀면 모든 원소가 원래 자리로 돌아옵니다.
• 따라서 $K$가 배열 길이 $N$보다 크더라도, 실제로 움직여야 하는 칸 수는 $K \% N$번입니다.
(예: $N=5, K=12$이면 $12 \% 5 = 2$이므로 2칸만 오른쪽으로 밀면 됩니다!)
k = k % n  # 실제로 회전할 칸 수 계산

2. 해결 방법 A: 파이썬 슬라이싱(Slicing) 활용
오른쪽으로 $K$칸 밀리면 뒤쪽의 $K$개 원소가 앞쪽으로 오고, 앞쪽의 나머지 원소들이 뒤로 이동합니다.
• 뒤쪽 $K$개 원소: arr[-k:]
• 앞쪽 나머지 원소: arr[:-k]
• 두 부분을 이어 붙이기: result = arr[-k:] + arr[:-k]

3. 해결 방법 B: 새로운 위치(인덱스) 계산하기 (C / C++ / Python 공통)
원래 배열의 $i$번째 원소는 오른쪽으로 $K$칸 밀려나면 새 배열의 (i + k) % n번 위치로 이동합니다.
새 배열을 미리 만들어두고 다음과 같이 채워 넣을 수도 있습니다.
result = [0] * n
for i in range(n):
    result[(i + k) % n] = arr[i]

4. 출력 방법 (공백으로 구분하여 한 줄에 출력)
• 방법 1: print(*(result)) (언패킹 * 활용)
• 방법 2: print(' '.join(map(str, result)))
• 방법 3: 반복문(for문) 활용
for x in result:
    print(x, end=' ')
NOTICE  —  BFStudy OJ 정보샘
애들아, 문제 많이 풀고 게임 잠깐 하는거지?
— 정보샘