크래프톤 정글/정글에서 문제풀기

[정글 베이직 2] 배열을 돌린다는 것 — (i, j) → (j, n-1-i)

cedis 2026. 3. 7. 23:17

 


솔직히 말하면, 이 문제 처음 봤을 때 별거 아니겠다 싶었다.

배열이잖아. 인덱스 접근이 뭔지 모르는 것도 아니고.
근데 막상 코드 창 열고 앉으니까 — 손이 안 움직였다.


문제 소개

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)

이걸 처음 봤을 때 드는 생각.

"아 그렇구나."

그다음 생각은?

"...근데 이게 코드로 어떻게 되지?"

이해한 줄 알았는데 이해한 게 아니었다.
공식을 읽었을 뿐이지, 머릿속에서 숫자로 한 번도 돌린 적이 없었다.


공식을 직접 돌려보다

예제 배열이 이거다.

원본 배열
1 2 3
4 5 6
7 8 9
회전 후 배열
7 4 1
8 5 2
9 6 3

공식이 있었는데도 처음에 두 번 연속으로 틀렸다. 숫자를 머릿속에서 굴리지 않고 그냥 아무 값이나 뱉은 거였다.

두 번 틀리고 나서야 진짜로 계산을 했다.

변수 계산 결과
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도 회전이다.
(i, j)  →  (j, n-1-i)
이 공식 하나가 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)는 요약이다.
요약을 읽으면 이해한 것 같지만, 숫자를 한 번도 안 넣어봤다면 그냥 문자열을 본 거다.
값 하나 넣어보고, 어디로 가는지 눈으로 확인하고, 그다음에 공식으로 돌아와야 진짜가 된다.

다음 문제로 넘어갔다.

🌿