사용자로부터 입력받은 배열이 주어졌을 때, 이 배열의 모든 요소를 시계 방향(오른쪽)으로 한 칸씩 순환 회전시키는 것이 목표입니다.
예시
입력: A=[1,2,3,4,5] 출력: [5,1,2,3,4]
위 예시에서 마지막 요소인 5가 배열의 맨 앞으로 이동하고, 나머지 요소들은 각각 한 칸씩 뒤로 밀려난 것을 확인할 수 있습니다.
알고리즘
1단계: 배열의 요소를 입력받는다. 2단계: 배열의 마지막 요소를 변수 x에 저장한다. 3단계: 나머지 모든 요소를 한 칸씩 뒤로 이동시킨다. 4단계: 배열의 첫 번째 요소를 x로 교체한다.
구현 코드
# 파이썬 프로그램: 배열을 한 칸씩 순환 회전
# 회전을 수행하는 함수
def rotate(A, n):
x = A[n - 1] # 마지막 요소 저장
for i in range(n - 1, 0, -1):
A[i] = A[i - 1] # 요소들을 뒤로 한 칸씩 이동
A[0] = x # 첫 번째 위치에 마지막 요소 배치
# 메인 함수
A = list()
n = int(input("리스트의 크기를 입력하세요 ::"))
print("리스트의 요소를 입력하세요 ::")
for i in range(int(n)):
k = int(input(""))
A.append(k)
print("원본 배열 ::>")
for i in range(0, n):
print(A[i], end=' ')
rotate(A, n)
print("\n회전된 배열 ::")
for i in range(0, n):
print(A[i], end=' ')
실행 결과
리스트의 크기를 입력하세요 ::5 리스트의 요소를 입력하세요 :: 8 7 90 67 56 원본 배열 ::> 8 7 90 67 56 회전된 배열 :: 56 8 7 90 67
동작 원리 설명
이 알고리즘의 핵심은 마지막 요소를 미리 저장해 두는 것입니다. 요소들을 뒤로 이동시키는 과정에서 마지막 값이 덮어써질 수 있기 때문입니다.
- 변수
x에 마지막 요소(56)를 저장합니다. range(n - 1, 0, -1)을 사용해 배열의 끝에서부터 시작 위치까지 역순으로 순회하며, 각 요소를 바로 앞 요소의 값으로 대체합니다.- 루프가 끝나면 첫 번째 자리가 비게 되므로, 저장해 둔
x를A[0]에 넣어 회전을 완성합니다.
시간 복잡도
배열의 모든 요소를 한 번씩 순회하므로 시간 복잡도는 O(n)이며, 추가 변수 하나만 사용하므로 공간 복잡도는 O(1)입니다.