욤미의 개발일지

[Python] 2차원 리스트 90도 회전 본문

Python

[Python] 2차원 리스트 90도 회전

욤미 2022. 9. 23. 16:43

[Python] 2차원 리스트 90도 회전

2차원 리스트 90도 회전

90도 회전했을 때 행, 열이 변하는 규칙을 정리하면 다음과 같다.

  • 회전한 후 행 번호 = 회전하기 전 열 번호
  • 회전한 후 열 번호 = N - 1 - 회전하기 전 행 번호

  이러한 규칙을 코드로 나타내면 다음 코드와 같다.  

리스트를 시계방향으로 90도 회전하는 일반적인 방법

def rotated(array_2d):
    n = len(array_2d) # 행 길이
    m = len(array_2d[0]) # 열 길이 
    result = [[0] * n for _ in range(m)] # 회전한 결과를 표시하는 배열

    for i in range(n):
        for j in range(m):
            result[j][n-i-1] = array_2d[i][j]
    return result

리스트 회전은 zip함수를 사용하여 구현할 수도 있다.

zip함수를 사용하는 방법

def rotated(array_2d):
    list_of_tuples = zip(*array_2d[::-1])
    return [list(e) for e in list_of_tuples]

위 코드의 자세한 동작과정은 다음과 같다.

 

1. 배열을 역순으로 바꾼다.

array_2d = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

reversed_ = array_2d[::-1]
print(reversed_)
# [[7, 8, 9], [4, 5, 6], [1, 2, 3]]

 

2. 2차원 배열의 인자를 별표(*, Asterisk)로 unpacking하고 zip()으로 묶어준다.

  • unpacking은 괄호 안에 있던 데이터들을 풀어 각각으로 만들어 준다.
  • zip()은 각 인자들을 tuple로 묶어 zip object로 반환한다.
list_of_tuples = zip(*array_2d[::-1])
print(list_of_tuples)
# <zip object at 0x7f16a09c1540>

 

3. tuple로 반환되는 요소를 리스트로 바꾸어준다.

return [list(e) for e in list_of_tuples]
# [[7, 4, 1], [8, 5, 2], [9, 6, 3]]

 


 

180도 회전

def rotated(list_2d):
    n = len(list_2d)
    m = len(list_2d[0]) 
    result = [[0] * n for _ in range(m)]
    for i in range(n):
        for j in range(m):
            result[m-j-1][n-i-1] = list_2d[i][j]
    return result

270도 회전

-90도 회전하는 것과도 같다. 또는 180 + 90도 회전으로 이해할 수 있다.

def rotated(list_2d):
    n = len(list_2d) 
    m = len(list_2d[0])
    result = [[0] * n for _ in range(m)]
    for i in range(n):
        for j in range(m):
            result[m-j-1][i] = list_2d[i][j]
    return result

 

리스트 회전을 이용하는 문제

2020 KAKAO BLIND RECRUITMENT 자물쇠와 열쇠

백준 18808번 스티커 붙이기

728x90
Comments