3085 : 배열의 오른쪽 회전
•시간제한: 1.000 S
•메모리제한: 256 MB
•제출: 110
•통과: 41
•만든사람: suakii
문제 설명
$N$개의 숫자로 이루어진 배열이 주어집니다.
이 배열의 모든 원소를 오른쪽으로 $K$칸씩 밀어서 회전시키는 프로그램을 작성하세요. 배열의 맨 오른쪽 끝에 있던 원소는 밀려나면 다시 배열의 맨 왼쪽 처음으로 돌아옵니다.
[제약 조건]
• $1 \le N \le 1000$
• $1 \le K \le 10000$
• 입력되는 모든 값은 정수
입력 설명
첫째 줄에 배열의 크기 $N$과 회전시킬 칸 수 $K$가 공백으로 구분되어 주어집니다.
둘째 줄에 배열의 원소 $N$개가 공백으로 구분되어 주어집니다.
둘째 줄에 배열의 원소 $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칸만 오른쪽으로 밀면 됩니다!)
2. 해결 방법 A: 파이썬 슬라이싱(Slicing) 활용
오른쪽으로 $K$칸 밀리면 뒤쪽의 $K$개 원소가 앞쪽으로 오고, 앞쪽의 나머지 원소들이 뒤로 이동합니다.
• 뒤쪽 $K$개 원소:
• 앞쪽 나머지 원소:
• 두 부분을 이어 붙이기:
3. 해결 방법 B: 새로운 위치(인덱스) 계산하기 (C / C++ / Python 공통)
원래 배열의 $i$번째 원소는 오른쪽으로 $K$칸 밀려나면 새 배열의
새 배열을 미리 만들어두고 다음과 같이 채워 넣을 수도 있습니다.
4. 출력 방법 (공백으로 구분하여 한 줄에 출력)
• 방법 1:
• 방법 2:
• 방법 3: 반복문(for문) 활용
배열의 원소들을 오른쪽으로 밀 때 알아두면 좋은 핵심 팁입니다.
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=' ')