새소식

Computer Science/외우면 좋은 로직

2차원 배열 회전

  • -

이번에는 2차원 배열, 격자의 요소들을 90,180,270 회전해보는 함수를 짜보자 

 

관련문제 : 프로그래머스 행렬 테두리 회전하기

 

2차원 배열은 90도 단위로 회전한다. 90,180,270, 360도.

360도 회전한 결과는 처음 배열과 같으며 이후에는 이 4개의 형태를 반복한다. 

 

 

예로 3x3 격자가 있다고 하자.

[1,2,3]이 첫 행이 어떻게 변화하는지 먼저 살펴보고 모두 적용해보자. 

90도 회전하면 격자의 각 요소는 그림과 같은 값을 갖는다

N=1은 (0,0)에서 (0,2)가 되었고 

N=2는 (0,1)에서 (1,2)가 되었다.

N=3은 (0,2)에서 (2,2)가 되었다. 

 

각 상태의 행과 열을 기준으로 살펴보자. 여기서 규칙성이 보인다.

 

회전 전열 번호회전 후행 번호가 일치한다. 
그리고 회전 후의 열 N-1 에서 회전 전의 행뺀 값과 같다.

MxM 격자 

Before: i행,j열의 N값이면 

After : (N-1,M-1-i) 라는것을 알수있다

 

 

코드로 구현하자 

def rotate_90(board):
    N=len(board)
    new_board=[[0]*N for _ in range(N)]
    
    for r in range(N):  # 행
        for c in range(N):
            new_board[c][N-1-r]=board[r][c]
    
    return new_board

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

print(rotate_90(board))

 

계속해서 180도 회전 코드 

def rotate_180(board):
    N = len(board)
    new_board = [[0] * N for _ in range(N)]

    for r in range(N):
        for c in range(N):
            new_board[N-1-r][N-1-c] = board[r][c]
            
    return new_board

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

print(rotate_180(board))

 

계속해서 270도 회전 코드 

def rotate_270(board):
    N = len(board)
    new_board = [[0] * N for _ in range(N)]

    for r in range(N):
        for c in range(N):
            new_board[N-1-c][r] = board[r][c]
            
    return new_board

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

print(rotate_270(board))

 

최종 코드 

# d는 회전 단위 -> -1:-90도, 1:90도, 2:180도, 3:270도
def rotate(board, d):

    N = len(board)
    new_board = [[0] * N for _ in range(N)]

    if d % 4 == 1:              # 90도
        for r in range(N):
            for c in range(N):
                new_board[c][N-1-r] = board[r][c]
    elif d % 4 == 2:            # 180도 
        for r in range(N):
            for c in range(N):
                new_board[N-1-r][N-1-c] = board[r][c]
    elif d % 4 == 3:            # 270도
        for r in range(N):
            for c in range(N):
                new_board[N-1-c][r] = board[r][c]
    else:                       # 360도
        for r in range(N):
            for c in range(N):
                new_board[r][c] = board[r][c]

    return new_board

board=[[1,2,3],
       [4,5,6],
       [7,8,9]]
d=3
rotated_board=rotate(board, d)
for b in rotated_board:
    print(b)

90도 회전은 1, 5, … 처럼 4로 나눈 나머지가 1,
180도 회전은 2, 6, … 처럼 4로 나눈 나머지가 2,
270도 회전은 3, 7, … 처럼 4로 나눈 나머지가 3,
360도 회전은 4, 8, … 처럼 4로 나눈 나머지가 0,

 

관련 문제 보러 가기

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.