728x90
당신은 배열을 회전시키는 방법을 몇 개나 알고 있습니까...?
좌표 값으로 회전시키는 방법만 생각하다가 전치 시키는 방법을 알게 되어
선형대수가 나와 망치로 한 대 맞은 기분이 들었고
까먹을까봐 블로그에 정리하러 왔읍니다... 😵
먼저, 대부분이 알고 있는 좌표 값으로 배열을 회전시킨다.
1. 좌표 값으로 회전
1(0, 0) | 2(0, 1) | 3(0, 2) | 시계 방향으로 90도 회전하면, (i, j) -> ( n - j - 1, i ) 이 된다. (ex. 7(2, 0) -> 7(3-0-1=0, 2) |
7(0, 0) | 4(0, 1) | 1(0, 2) |
4(1, 0) | 5(1, 1) | 6(1, 2) | 8(1, 0) | 5(1, 1) | 2(1, 0) | |
7(2, 0) | 8(2, 1) | 9(2, 2) | 9(2, 0) | 6(2, 1) | 3(2, 0) |
grid = [[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
rotate_grid = [[0] * 3 for _ in range(3)]
for i in range(3):
for j in range(3):
rotate_grid[i][j] = grid[3 - j - 1][i]
print()
print("시계 방향 회전")
for row in rotate_grid:
print(*row)
for i in range(3):
for j in range(3):
rotate_grid[i][j] = grid[j][3 - i - 1]
print()
print("반시계 방향 회전")
for row in rotate_grid:
print(*row)
이렇게 됩니다.
2. 행 뒤집기 + 전치 시키기
시계 방향 90도 회전 ➡️ 행 뒤집고 전치
mat[::-1]
2차원 배열을 [::-1] (문자열 슬라이스) 뒤집기를 하면, 아래처럼 된다.
mat = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ] |
➡️ | mat = [ [7, 8, 9], [4, 5, 6], [1, 2, 3] ] |
zip(*mat[::-1])
그 상태에서 zip(* ) 해주면,
*mat[::-1] ➡️ ([7, 8, 9], [4, 5, 6], [1, 2, 3])
zip(*mat[::-1]) ➡️ ((7, 4, 1), (8, 5, 2), (9, 6, 3))
[list(row) for row in zip(*mat[::-1])]
zip한 걸 한 줄씩 리스트로 만들어서 배열로 완성시켜주면,
[[7, 4, 1],
[8, 5, 2],
[9, 6, 3]]
이 된다.
반시계 방항 90도 회전 ➡️ 전치 후 행 뒤집기
[list(row) for row in zip(*mat)]
((1, 4, 7), (2, 5, 8), (3, 6, 9))로 먼저 전치시켜준다.
[[1, 4, 7],
[2, 5, 8],
[3, 6, 9]]
[list(row) for row in zip(*mat)][::-1]
이후 행 뒤집기를 하면,
[[3, 6, 9],
[2, 5, 8],
[1, 4, 7]]
반시계 방향(왼쪽)으로 회전한 형태를 볼 수 있다.
grid = [[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
def rotate_90_clockwise(mat): # 시계 방향 90도 회전
return [list(row) for row in zip(*mat[::-1])]
print()
print("시계 방향 회전")
for row in rotate_90_clockwise(grid):
print(*row)
def rotate_90_counterclockwise(mat): # 반시계 방향 90도 회전
return [list(row) for row in zip(*mat)][::-1]
print()
print("반시계 방향 회전")
for row in rotate_90_counterclockwise(grid):
print(*row)
이렇게 됩니다.
반응형
'🚩 Coding Test' 카테고리의 다른 글
[Softeer][Python] Lv.2 나무 공격 (1) | 2024.11.12 |
---|---|
[PCCP 대비 파이썬 문법 정리] (0) | 2024.11.01 |