파이썬으로 배열을 돌려보자

2024. 1. 25. 21:40PS/PS 팁

[ 작성 이유 ]

 생각보다 구현과 관련해서 PS로 배열을 돌려야하는 상황이 자주 있는 것 같다. 예전에 코딩테스트를 봤을 때도 배열 돌리기 문제가 굉장히 귀찮았던 것으로  기억한다. 하는 김에 배열 돌리기를 한번 익혀 보자.

 

[ N x N 배열을 돌려보자 ]

N x N 배열을 한번 돌려보자. 배열을 돌리면 규칙을 발견할 수 있다. 우선 배열을 좌측으로 회전시켜보자.

 

좌표를 기준으로 놓았는데 총 9개의 결과를 얻을 수 있다.

(0,0) -> (2,0) | (0,1) -> (1,0) | (0, 2) -> (0,0) |

(1,0) -> (2,1) | (1,1) -> (1,1) | (1,2) -> (0,1) |

(2,0) -> (2,2) | (2,1) -> (1,2) | (2,2) -> (0,2)

 

좌측으로 회전하면 알 수 있는 규칙은 N x N일 때 각각의 좌표가 (i, j)라고 하면 회전 후 (N-1-j, i)로 이동한다. 

 

똑같은 방식으로 우측 회전을 구해보면 우측으로 회전할 땐 N x N인 경우 각각의 좌표가 (i,j)라고 하면 회전 후 (j, N-1-i)으로 이동한다.

그리고 180도로 회전하게 되면 기존 좌표와 대비해서 (N-i-1, N-j-1)로 이동하게 된다.

 

그러면 코드로 다음과 같이 작성할 수 있다. 되도록이면 간단하니까 좀 외워야겠다. 규칙이 어렵진 않은데 생각보다 딱 찾으라고 하면 꽤나 시간이 오래 걸린다. 

def roration(rotate, key):
    N = len(key)
    
    if(rotate == 0): # 좌측회전 90도
        rotateKey = [[0] * N for i in range(N)]
        for i in range(N):
            for j in range(N):
                rotateKey[N-1-j][i] = key[i][j]
        return rotateKey
    elif(rotate == 1): # 우측회전 90도
        rotateKey = [[0] * N for i in range(N)]
        for i in range(N):
            for j in range(N):
                rotateKey[j][N-1-i] = key[i][j]
        return rotateKey
    elif(rotate == 2): # 180도 회전
        rotateKey = [[0] * N for i in range(N)]
        for i in range(N):
            for j in range(N):
                rotateKey[N-1-i][N-1-j] = key[i][j]
        return rotateKey

 

[ N x M 배열을 회전 시켜보자 ]

 배열 회전에서 새 배열을 할당하는 이유는 그게 값을 변경할 때 더 자유롭기 때문이다. 특히 어지간한 난이도의 문제에서는 N x N의 배열이 아니라 N x M의 배열을 회전시키게 할 것이다. 그런데 N x M을 회전시키면 M x N 배열이 된다. 이걸 기존 배열에서 조작해서 만드는 것은 쉽지 않다. 차라리 새 배열을 만들어서 거기에 값을 복사해놓고 덮어 씌워버리는게 제일 좋다.

 

좌측으로 회전 시켰을 때는 (i, j)에 있던 게 (M-1-j, i)으로 이동한다.

우측으로 회전 시켰을 때에는 (i, j) 값이 (j, N-1-i)으로 이동하게 된다.

 

180도 회전시켰을 땐 (i, j) 값이 (N-1-i)(M-1-j)값으로 이동하게 된다.

 

이를  코드로 나타내면 다음과 같이 표현할 수 있다.

def roration(rotate, key):
    N = len(key)
    M = len(key[0])
    
    if(rotate == 0): # 좌측회전 90도
        rotateKey = [[0] * N for i in range(M)]
        for i in range(N):
            for j in range(M):
                rotateKey[M-1-j][i] = key[i][j]
        return rotateKey
    elif(rotate == 1): # 우측회전 90도
        rotateKey = [[0] * N for i in range(M)]
        for i in range(N):
            for j in range(M):
                rotateKey[j][N-1-i] = key[i][j]
        return rotateKey
    elif(rotate == 2): # 180도 회전
        rotateKey = [[0] * M for i in range(N)]
        for i in range(N):
            for j in range(M):
                rotateKey[N-1-i][M-1-j] = key[i][j]
        return rotateKey

 

'PS > PS 팁' 카테고리의 다른 글

내가 보려고 만든 PS 팁 - 1  (0) 2024.03.23