본문 바로가기
DEVLOG/Algorithms

[파이썬(Python)] 회전행렬 / 2차원배열 회전하는 법 구현하기

2019. 9. 19.
반응형

알고리즘 문제를 풀면서 종종 2차원 배열을 회전하는 경우가 있습니다.

미리 정리해주면 좋을 것 같아서 회전 각도별로 코드 구현을 정리해봤습니다.

 

90도 회전

def rotate_90(m):
    N = len(m)
    ret = [[0] * N for _ in range(N)]

    for r in range(N):
        for c in range(N):
            ret[c][N-1-r] = m[r][c]

    return ret

 

180도 회전

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

    for r in range(N):
        for c in range(N):
            ret[N-1-r][N-1-c] = m[r][c]
    
    return ret

 

 

270도 회전

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

    for r in range(N):
        for c in range(N):
            ret[N-1-c][r] = m[r][c]
    return ret

 

총 정리

def rotate(m, d):
    """
    2차원 배열을 90도 단위로 회전해 반환한다.
    이때 원 배열은 유지되며, 새로운 배열이 탄생한다. 이는 회전이 360도 단위일 때도 해당한다.
    2차원 배열은 행과 열의 수가 같은 정방형 배열이어야 한다.

    :input:
    m: 회전하고자 하는 2차원 배열. 입력이 정방형 행렬이라고 가정한다.
    d: 90도씩의 회전 단위. -1: -90도, 1: 90도, 2: 180도, ...
    """
    N = len(m)
    ret = [[0] * N for _ in range(N)]

    if d % 4 == 1:
        for r in range(N):
            for c in range(N):
                ret[c][N-1-r] = m[r][c]
    elif d % 4 == 2:
        for r in range(N):
            for c in range(N):
                ret[N-1-c][N-1-r] = m[r][c]
    elif d % 4 == 3:
        for r in range(N):
            for c in range(N):
                ret[N-1-c][r] = m[r][c]
    else:
        for r in range(N):
            for c in range(N):
                ret[r][c] = m[r][c]

    return ret

 

 

반응형

댓글