행렬회전
- 매일 구현하려고 하면 햇갈려서 저장용
간단 설명
- 새로운 행렬을 만들어주고 원본 배열을 돌려서 저장하는방식
- 새로 만들어지는 배열(90도,-90도)은 가로와 세로길이가 서로 뒤바뀐다.
- 90도 회전은 원본 [x,y]가 회전후에는 [y,원본세로길이-x]가 되는 규칙이 존재
- 180도 회전은 원본 [x,y]가 회전후에는 [원본세로길이-x,원본가로길이-y]되는 규칙이 존재
- 270도(-90도)회전은 원본 [x,y]가 회전후 [원본가로길이-y,x]되는 규칙이 존재
코드
- 파이썬
def rotate90(g): # 90도
# 0,0 -> 0,5
# 0,1 -> 1,5
# 0,2 -> 2,5
# 0,3 -> 3,5
# 0,4 -> 4,5
# 0,5 -> 5,5
# x,y = y,끝-1-x
# 5,0 -> 0,0
tmp = [[0]*len(g) for _ in g[0]]
for i in range(0,len(g)):
for j in range(0,len(g[0])):
tmp[j][len(g)-1-i] = g[i][j]
return tmp
def rotate180(g): # 180도
# 0,0 -> 5,5
# 0,1 -> 5,4
# 1,0 -> 4,5
tmp = [[0]*len(g[0]) for _ in g]
for i in range(0,len(g)):
for j in range(0,len(g[0])):
tmp[len(g)-1-i][len(g[0])-1-j] = g[i][j]
return tmp
- 자바
//우측 90도시계방향
public static int[][] turn90(int[][] map) {
//오른쪽 90도, 시계방향
int H = map.length;
int W = map[0].length;
int[][] nMap = new int[W][H];
//이런 형태도 가능
// for (int i = 0; i < W; i++) {
// for (int j = 0; j < H; j++) {
// nMap[i][j] = map[H-1-j][i];
// }
// }
for (int i = 0; i < H; i++) {
for (int j = 0; j < W; j++) {
nMap[j][H-1-i] = map[i][j];
}
}
return nMap;
}
//좌측90도 반시계
public static int[][] turn270(int[][] map) {
//왼쪽 90도, 시계방향
int H = map.length;
int W = map[0].length;
int[][] nMap = new int[W][H];
//이런 형태도 가능
// for (int i = 0; i < W; i++) {
// for (int j = 0; j < H; j++) {
// nMap[i][j] = map[j][W-1-i];
// }
// }
for (int i = 0; i < H; i++) {
for (int j = 0; j < W; j++) {
nMap[W-1-j][i] = map[i][j];
}
}
return nMap;
}