본문 바로가기
Python/파이썬 문법 Tips

[ 파이썬(python) ] 2차원 행렬 시계방향으로 한 칸씩 회전하기

by YWTechIT 2021. 7. 15.
728x90

📍 2차원 행렬 시계방향으로 한 칸씩 회전하기

카카오 코딩 테스트를 보다가 2차원 행렬을 시계방향으로 회전하라길래 저번배열돌리기 3 문제를 풀어본 경험이 있어 풀 수 있을 것 같았는데 못 풀었다. 😂 😂 눈물을 머금으며 다음엔 꼭 풀겠다는 취지로 글을 남긴다.

 

이번에는 90도 회전이 아닌 시계방향 혹은 반시계방향으로 한 칸씩 이동하는 방법을 배워보려고 한다. 이때 전체 범위를 회전하지 말고 주어진 범위 내에서 테두리의 값만 이동하자. 다음과 같이 5*5행렬이 있을 때 파란색 빗금 친 범위만 시계방향으로 바꾸려고 한다.

 

 

처음 로직을 구현할 때 dx, dy를 이용해서 옮길 좌표를 우측으로 한 칸 혹은 아래쪽으로 한 칸 이렇게 짜는 줄 알았더니 dx, dy는 사용하지 않고, 범위를 설정해서 row+1 혹은 column+1 을 해주는 방법을 사용해야 한다.

 

 

728x90

순서는 다음과 같다.

  1. 우리가 퍼즐을 맞출 때 한 칸을 따로 빼두고 진행하는 것처럼 배열에서 temp에 저장할 값 1개를 빼둔다. (그래야 빼 둔 칸으로 한 칸씩 밀어 올릴 수 있다. 나는 temp7로 정했다.)
  2. 시계방향으로 움직인다고 해서 temp를 기준으로 시계방향으로 이동하는 것이 아니라 우리는 반 시계방향으로 값을 하나씩 이동시켜준다. 여기서 중요한 포인트는 한 반복문에서 값을 이동시킬 때 맨 마지막 값은 그대로 남아 있다는 것이다. (이 포인트를 생각하지 못해서 감을 못 잡았었다.)
  3. 반복문의 범위는 이동시키려고 하는 값의 반대 방향으로 선언해야 한다. (1번과 2번은 linear, 3번과 4번은 reverse)
  4. 하단 그림의 4번까지 끝내고 나서 temp는 맨 처음 temp 위치에서 column + 1 값에 넣어준다. (반시계 방향이면 row-1이겠지??)

 

 

row, column = 5, 5
queries = [[2, 2, 4, 4]]    # x1, y1, x2, y2 (x1, y1 부터 x2, y2 범위)

arr = [[0] * column for _ in range(row)]
cnt = 0

for i in range(row):
    for j in range(column):
        cnt += 1
        arr[i][j] = cnt

for t, l, b, r in queries:
    top, left, bottom, right = t - 1, l - 1, b - 1, r - 1    # index 계산을 편하게 하기 위해서 빼준다.
    temp = arr[top][left]

    for k in range(top, bottom):    # 1번
        arr[k][left] = arr[k + 1][left]

    for k in range(left, right):    # 2번
        arr[bottom][k] = arr[bottom][k + 1]

    for k in range(bottom, top, -1):    # 3번
        arr[k][right] = arr[k - 1][right]

    for k in range(right, left, -1):    # 4번
        arr[top][k] = arr[top][k - 1]

    arr[top][left + 1] = temp    # temp 넣기

    for i in arr:
        print(*i, end=' ')
        print()

👉🏽
1 2 3 4 5 
6 12 7 8 10 
11 17 13 9 15 
16 18 19 14 20 
21 22 23 24 25
반응형

댓글