핵심 요약

아래 코드가 결국 Python으로 간단하게 표현하는 90도 회전 코드입니다.

def rotate90(l):
  return [''.join(x) for x in zip(*l[::-1])]

원리

일단 행렬을 배열로 표현했을 때, 와 같이 인덱스를 표현했다고 생각해봅시다. 이때 아래와 같이 는 아래로 내려갈 수록 증가하고, 는 오른쪽으로 갈 수록 증가합니다.

위의 그림을 그대로 90도 회전시켜보겠습니다. (글자는 보기 좋게 조정합니다.)

그리고 나서 한번 새롭게 를 기존 행렬 방향에 맞게 적어보겠습니다. 새롭게 적힌 y와 x가 우리가 원하는 90도 회전되었을 때의 인덱스 표시입니다.

  1. 와 동일한 방향을 보고 있네요.
  2. 와 반대 방향을 보고 있습니다.

그렇다면 우리는 y와 x를 기준으로 새로운 행렬(ar을 90도 회전시킨 행렬)을 만들어야 하니, 위의 규칙을 활용해봅시다.

바깥 for문을 통해 주로 행 단위로 움직입니다. 그리고 안쪽 for문을 통해 열 단위를 움직이죠. 그리고 각 행마다 완성시킨 뒤 행렬을 완성시키는 방법을 사용합니다.

그렇다면 행 단위(y)로 움직이는 것은 현재 j입니다. 따라서 j가 바깥 for문에 위치합니다. 그리고 열 단위(x)로 움직이는 것은 i입니다. 다만 반대 방향으로 움직이니 i가 반대 방향으로 순회해야 합니다.

이를 코드로 보면 바로 이해할 수 있습니다.

ar = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
n = 3
 
new_ar = []
for j in range(n):
  row = []
  for i in range(n - 1, -1, -1):
	    row.append(ar[i][j])
	new_ar.append(row)

90도 외에도, 180도, 270도 또한 동일한 방법으로 처리할 수 있습니다.

하지만 굳이 그렇게 하지 않고 90도 회전을 여러 번 적용하면 깔끔하게 처리할 수 있습니다.

추천 문제

연관 페이지

참고 문헌 / 사이트