
솔직히 말하면, 이 문제 처음 봤을 때 별거 아니겠다 싶었다.
배열이잖아. 인덱스 접근이 뭔지 모르는 것도 아니고.
근데 막상 코드 창 열고 앉으니까 — 손이 안 움직였다.
문제 소개
N x N 크기의 2차원 배열을 시계방향으로 90도 회전시키는 문제다.
핵심은 배열의 각 요소가 회전 후 어떤 위치로 이동하는지, 그 인덱스 변환 규칙을 이해하는 것.
| 항목 | 내용 |
|---|---|
| 입력 | N x N 크기의 2차원 리스트 matrix |
| 출력 | 시계방향 90도 회전된 2차원 리스트 |
| 핵심 규칙 | (i, j) → (j, n-1-i) |
예제 입출력은 이렇다.
# 입력
[
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
# 출력
[
[7, 4, 1],
[8, 5, 2],
[9, 6, 3]
]
3x3뿐 아니라 4x4 테스트 케이스도 있었다. 즉 하드코딩은 안 된다.
n을 이용해서 어떤 크기든 동작하는 코드를 짜야 한다.
힌트가 있었는데도 몰랐다
문제에 힌트가 친절하게 적혀 있었다.
회전 후 위치: (i, j) → (j, n-1-i)
이걸 처음 봤을 때 드는 생각.
"아 그렇구나."
그다음 생각은?
"...근데 이게 코드로 어떻게 되지?"
이해한 줄 알았는데 이해한 게 아니었다.
공식을 읽었을 뿐이지, 머릿속에서 숫자로 한 번도 돌린 적이 없었다.
공식을 직접 돌려보다
예제 배열이 이거다.
원본 배열
|
↻ | 회전 후 배열
|
공식이 있었는데도 처음에 두 번 연속으로 틀렸다. 숫자를 머릿속에서 굴리지 않고 그냥 아무 값이나 뱉은 거였다.
두 번 틀리고 나서야 진짜로 계산을 했다.
| 변수 | 값 | 계산 | 결과 |
|---|---|---|---|
i |
0 | j → 0 | (0, 0) → (0, 2) |
j |
0 | n-1-i → 3-1-0 | |
n |
3 | = 2 |
1이 오른쪽 위 끝으로 간다.
원본 첫 번째 줄의 첫 값이, 회전된 배열 첫 번째 줄의 마지막 값이 된다.
나머지 값들도 직접 쫙 계산해봤다.
| 원본 위치 | 값 | 이동 계산 | 회전 후 위치 |
|---|---|---|---|
| (0, 0) | 1 | j=0, n-1-i=2 | (0, 2) |
| (0, 1) | 2 | j=1, n-1-i=2 | (1, 2) |
| (0, 2) | 3 | j=2, n-1-i=2 | (2, 2) |
| (1, 0) | 4 | j=0, n-1-i=1 | (0, 1) |
| (2, 0) | 7 | j=0, n-1-i=0 | (0, 0) |
원본의 첫 번째 열[1, 4, 7]→ 회전 후 첫 번째 행[7, 4, 1]
세로로 서있던 줄이 가로로 눕는다. 그게 시계방향 90도 회전이다.
코드로 옮기기 — 생각보다 단순하다
개념을 잡고 코드를 짜기 시작했다. 흐름은 딱 3단계다.
|
1
|
결과를 담을 빈 배열 만들기
rotated = [[0] * n for _ in range(n)]처음에 matrix2 = [[0]*n for n in range(n)] 라고 썼는데 두 가지 문제가 있었다.for n in range(n) — 바깥 변수 n을 덮어쓴다.그리고 아래에서는 rotated를 반환하는데 matrix2를 만들었다.이름이 두 개였다. 실행하면 당연히 NameError. |
|
2
|
이중 for문으로 원본 순회
for i in range(n): for j in range(n):2차원 배열은 항상 이중 반복문이다. 이건 그냥 외워두는 게 낫다. |
|
3
|
공식 적용
rotated[j][n-1-i] = matrix[i][j](i, j) 위치의 값을 (j, n-1-i) 위치로 옮기는 것.공식을 이해했으면 이 한 줄은 자연스럽게 나온다. |
최종 코드
def rotate_matrix_90(matrix):
n = len(matrix)
rotated = [[0] * n for _ in range(n)]
for i in range(n):
for j in range(n):
rotated[j][n-1-i] = matrix[i][j]
return rotated
전체 흐름 한눈에 보기
| ① | 빈 배열 생성 | rotated = [[0]*n for _ in range(n)] |
| ↓ | ||
| ② | 이중 for문 | for i in range(n): for j in range(n): |
| ↓ | ||
| ③ | 공식 적용 | rotated[j][n-1-i] = matrix[i][j] |
| ↓ | ||
| ④ | 반환 | return rotated |
마무리
공식보다 먼저 해야 할 게 있다.
숫자 하나를 직접 넣어보는 것.
(i,j) → (j, n-1-i)는 요약이다.
요약을 읽으면 이해한 것 같지만, 숫자를 한 번도 안 넣어봤다면 그냥 문자열을 본 거다.
값 하나 넣어보고, 어디로 가는지 눈으로 확인하고, 그다음에 공식으로 돌아와야 진짜가 된다.
다음 문제로 넘어갔다.
🌿
'크래프톤 정글 > 정글에서 문제풀기' 카테고리의 다른 글
| [정글 베이직 6] 백 트래킹 (1) | 2026.03.09 |
|---|---|
| [정글 베이직 5] 재귀 함수 완성 (0) | 2026.03.08 |
| [정글 베이직 4] 두 수의 합 완성 (0) | 2026.03.08 |
| [정글 베이직 3] 회문 판별 (0) | 2026.03.08 |
| [정글 베이직 1] 리스트 컴프리헨션 — 파이썬답게 쓴다는 것 (0) | 2026.03.07 |