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 |
|---|