[코테] 2차원배열 회전하기

김재연·2023년 10월 13일
0
post-thumbnail

예시는 4x4 배열로 하겠당.

[1, 2, 3, 4]
[5, 6, 7, 8]
[9, 10, 11, 12]
[13, 14, 15, 16]

1. 시계방향으로 90도 회전하기

N = 4
square = [[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]]
temp = [] # 똑같은 배열 하나 더 만들기
for i in range(N):
    temp.append([square[i][j] for j in range(N)])

for r in range(N):
    for c in range(N):
        square[c][N-1-r] = temp[r][c] # 시계방향 90도 회전

for s in square:
    print(s)
[13, 9, 5, 1]
[14, 10, 6, 2]
[15, 11, 7, 3]
[16, 12, 8, 4]

2. 180도 회전하기

N = 4
square = [[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]]
temp = [] # 똑같은 배열 하나 더 만들기
for i in range(N):
    temp.append([square[i][j] for j in range(N)])

for r in range(N):
    for c in range(N):
        square[N-1-r][N-1-c] = temp[r][c] # 180도 회전

for s in square:
    print(s)
[16, 15, 14, 13]
[12, 11, 10, 9]
[8, 7, 6, 5]
[4, 3, 2, 1]

3. 반시계방향으로 90도 회전하기

= 시계방향으로 270도 회전하기

N = 4
square = [[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]]
temp = [] # 똑같은 배열 하나 더 만들기
for i in range(N):
    temp.append([square[i][j] for j in range(N)])

for r in range(N):
    for c in range(N):
        square[N-1-c][r] = temp[r][c] # 반시계방향 90도 회전

for s in square:
    print(s)
[4, 8, 12, 16]
[3, 7, 11, 15]
[2, 6, 10, 14]
[1, 5, 9, 13]

그런데 배열 전체가 아니라 부분만 회전하고 싶으면?

4. 부분만 회전하기

필요한 것은

  1. 회전할 부분배열의 시작점(좌측상단) 좌표 : x,y
  2. 회전할 부분배열의 크기 : d

N을 다 d로 바꾸고 좌표에 (x,y)를 다 더한다.

N = 4
square = [[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]]
temp = [] # 똑같은 배열 하나 더 만들기
for i in range(N):
    temp.append([square[i][j] for j in range(N)])

x = 1 # (x,y)에서 시작하는 정사각형 중
y = 1
d = 3 # 한 변의 길이가 d인 정사각형을 회전할 것임

for r in range(d):
    for c in range(d):
        square[x+c][y+d-1-r] = temp[x+r][y+c] # 시계방향 90도 회전

for s in square:
    print(s)
[1, 2, 3, 4]
[5, 14, 10, 6]
[9, 15, 11, 7]
[13, 16, 12, 8]

5. 정리~

x = 회전시킬 정사각형 범위의 시작점 행 (전체 회전시 0)
y = 회전시킬 정사각형 범위의 시작점 열 (전체 회전시 0)
d = 회전시킬 정사각형 한 변의 길이 (전체 회전시 N)
for r in range(d):
    for c in range(d):
        square[x+c][y+d-1-r] = temp[x+r][y+c] # 시계방향 90도 회전
        square[x+d-1-r][y+d-1-c] = temp[x+r][y+c] # 180도 회전
        square[x+d-1-c][y+r] = temp[x+r][y+c] # 반시계방향 90도 회전

그냥 다 외우자~~


Reference

[Python] 2차원 배열 회전 알고리즘
2차원 배열에서 90도 회전 알고리즘

profile
일기장같은 공부기록📝

0개의 댓글