안녕하세요! 맨덕입니다.
오늘은 알고리즘 문제를 풀다보면 일차원 리스트를 회전하여 푸는 문제가 많아
일차원리스트를 회전하는 방법 4가지에 대해 정리했습니다.
방법 1. 음수 인덱스를 활용하여 회전을 한다.
: 음수 인덱스는 뒤에서 부터 접근한다.
- a = [1, 2, 3, 4, 5]을 n만큼 왼쪽으로 회전해라
def left_rotate(test_list, n):
# 새로운 배열 만들고 초기화
new_list = [None for _ in range(len(test_list))] # [None, None, None, None, None]
for i in range(len(test_list)):
# 새로운 배열에 값 추가하기
new_list[i-n] = test_list[i]
return new_list
a = [1, 2, 3, 4, 5]
print(left_rotate(a,1)) # [2, 3, 4, 5, 1]
print(left_rotate(a,2)) # [3, 4, 5, 1, 2]
print(left_rotate(a,4)) # [5, 1, 2, 3, 4]
- a = [1, 2, 3, 4, 5]을 n만큼 오른쪽으로 회전해라
a = [1, 2, 3, 4, 5]
def right_rotate(test_list, n):
# 새로운 배열 만들고 초기화
new_list = [None for _ in range(len(test_list))] # [None, None, None, None, None]
for i in range(len(test_list)):
# 새로운 배열에 값 추가하기
new_list[i] = test_list[i-n]
return new_list
print(right_rotate(a,1)) # [5, 1, 2, 3, 4]
print(right_rotate(a,2)) # [4, 5, 1, 2, 3]
print(right_rotate(a,4)) # [2, 3, 4, 5, 1]
방법 2. 모듈 % 를 활용하여 회전 구현
- a = [1, 2, 3, 4, 5]을 n만큼 왼쪽으로 회전해라
def left_rotate(test_list, n):
# 새로운 배열 만들고 초기화
new_list = [None for _ in range(len(test_list))] # [None, None, None, None, None]
for i in range(len(test_list)):
# 새로운 배열에 값 추가하기
new_list[(i-n)%len(test_list)] = test_list[i]
return new_list
a = [1, 2, 3, 4, 5]
print(left_rotate(a,1)) # [2, 3, 4, 5, 1]
print(left_rotate(a,2)) # [3, 4, 5, 1, 2]
print(left_rotate(a,4)) # [5, 1, 2, 3, 4]
- 주의할 점은 -1%5 = 4이다.
- a = [1, 2, 3, 4, 5]을 n만큼 오른쪽으로 회전해라
a = [1, 2, 3, 4, 5]
def right_rotate(test_list, n):
# 새로운 배열 만들고 초기화
new_list = [None for _ in range(len(test_list))] # [None, None, None, None, None]
for i in range(len(test_list)):
# 새로운 배열에 값 추가하기
new_list[(i+n)%len(test_list)] = test_list[i]
return new_list
print(right_rotate(a,1)) # [5, 1, 2, 3, 4]
print(right_rotate(a,2)) # [4, 5, 1, 2, 3]
print(right_rotate(a,4)) # [2, 3, 4, 5, 1]
방법 3. 문자열 슬라이싱
- a = [1, 2, 3, 4, 5]을 n만큼 왼쪽으로 회전해라
def left_rotate(test_list, n):
return test_list[n:] + test_list[:n]
a = [1, 2, 3, 4, 5]
print(left_rotate(a,1)) # [2, 3, 4, 5, 1]
print(left_rotate(a,2)) # [3, 4, 5, 1, 2]
print(left_rotate(a,4)) # [5, 1, 2, 3, 4]
- a = [1, 2, 3, 4, 5]을 n만큼 오른쪽으로 회전해라
a = [1, 2, 3, 4, 5]
def right_rotate(test_list, n):
return test_list[-n:] + test_list[:-n]
print(right_rotate(a,1)) # [5, 1, 2, 3, 4]
print(right_rotate(a,2)) # [4, 5, 1, 2, 3]
print(right_rotate(a,4)) # [2, 3, 4, 5, 1]
- test_list[:len(test_list)-n] 는 test_list[:-n]와 같다.
- 전체 길이에서 n만큼 뺀 의미가 역슬라이싱인 -n은 같다.
방법 4. deque
from collections import deque
a = [1, 2, 3, 4, 5]
deque_a = deque(a)
# 오른쪽 방향
deque_a.rotate(2)
print(deque_a) # deque([4, 5, 1, 2, 3])
a = [1, 2, 3, 4, 5]
deque_a = deque(a)
# 왼쪽 방향(음수를 붙임)
deque_a.rotate(-2)
print(deque_a) # deque([3, 4, 5, 1, 2])
'개발언어 > python' 카테고리의 다른 글
comprehension (0) | 2023.01.14 |
---|---|
python 문자열 뒤집는 3가지 방법 - reversed / [::-1] / for (0) | 2023.01.04 |
가장 많이 쓰이는 print 공식문서로 톺아보기 (0) | 2023.01.04 |
for문 - range / enumerate() / 반복문 제어 (0) | 2023.01.03 |
if문 - if문/ 복수 if문 / 이중 if문 (2) | 2023.01.03 |
댓글