코테

2차원 배열의 회전 - Python

leeds123 2024. 2. 28. 18:13

2차원 배열을 시계방향으로 90*(n) 회전시키기

https://www.acmicpc.net/problem/20058

 

20058번: 마법사 상어와 파이어스톰

마법사 상어는 파이어볼과 토네이도를 조합해 파이어스톰을 시전할 수 있다. 오늘은 파이어스톰을 크기가 2N × 2N인 격자로 나누어진 얼음판에서 연습하려고 한다. 위치 (r, c)는 격자의 r행 c

www.acmicpc.net

백준 20058번 마법사 상어와 파이어스톰을 풀다가 2차원 배열을 회전 시켜야했다.

(삼성 기출 문제는 배열을 회전시키는 경우가 많은 듯...)

 

처음 나는 회전 시키기 위해 

2차원 배열이 행렬처럼 생기기도했고...

그래서 회전변환행렬(c, -s, s, c)을 생각했지만 전혀 필요없는 생각이었다..

 

유튜브 강의를 통해 회전 시키는 방법을 알게되었다.

arr = [[1, 2], [3, 4]]를 시계 방향으로 90도 회전시켜보자.

 

결과 먼저 생각해보자면 [[3, 1], [4, 2]]가 되어야한다.

1 2 3

4 5 6

7 8 9 (전)

----

7 4 1

8 5 2

9 6 3 (후)

여기서 핵심은 배열의 인덱스 값으로 파악하는 것이다.

3*3 2차원 배열에서

new의 [0][2] 의 값은 arr[0][0]의 값으로 되었고,

new[1][2] <- arr[0][1] 은 

new[2][2] <- arr[0][2]

new[0][1] <- arr[1][0]

.

.

.

 

 

규칙을 찾아보자면,

n*n 2차원 배열에서 90도 시계방향회전 한다면

new[i][j] <- arr[n-1-j][i] 이 된다.

이런 방법으로 180도, 270도 회전도 알아가면 된다.

n = 3
arr = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
new = [[0 for _ in range(3)] for _ in range(3)]
# 시계방향 90도 회전
for i in range(n):
    for j in range(n):
        new[i][j] = arr[n-1-j][i]

print(new)

#2차원 배열의 전체 합
total = sum(map(sum, new))
print(total)

 

코드를 작성할때는 new 배열의 인덱스를 기준으로

추가로 2차원 배열의 모든 요소를 sum 하는 방법도 새로 알게 되었다.

 

'코테' 카테고리의 다른 글

[소프티어] 나무 공격 Java  (8) 2024.11.02