[python/파이썬] 리스트 요소 회전하는 4가지 방법 - 음수인덱스/문자열슬라이싱/%모듈/deque

    안녕하세요! 맨덕입니다. 

    오늘은 알고리즘 문제를 풀다보면 일차원 리스트를 회전하여 푸는 문제가 많아
    일차원리스트를 회전하는 방법 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])
    

    댓글