728x90
반응형
오늘은 한 문제 풀이..!
1. Rotate Image
말 그대로 이미지를 시계방향으로 회전시키는 것이 목표이다. 이미지는 수의 배열들로 표현이 되기에, 결국엔 Matrix를 회전시키는게 목표이다!
머신러닝 공부를 하면서 transpose 개념을 조금 접해서 그런지 transpose하는 방법으로 생각해보았다.
(numpy T 사용하고 싶은 욕구..)
우선 예시로 이해해보자.
// Input 배열
[ 1, 2, 3 ]
[ 4, 5, 6 ]
[ 7, 8, 9 ]
// Output 배열
[ 7, 4, 1 ]
[ 8, 5, 2 ]
[ 9, 6, 3 ]
// 수행 과정
[ 1, 2, 3 ]
[ 4, 5, 6 ]
[ 7, 8, 9 ]
// 1. 먼저 transpose
[ 1, 4, 7 ]
[ 2, 5, 8 ]
[ 3, 6, 9 ]
// 2. 각 행마다 순서를 역으로 변경
[ 7, 4, 1 ]
[ 8, 5, 2 ]
[ 9, 6, 3 ]
고개를 왼쪽으로 돌려서 기존 배열을 보면 원하는 결과가 보인다...!
어떻게 구현해야할까 하다가, Matrix를 Transpose한 후 각 행들을 reverse처리하면 될 것 같았다!
(Transpose는 [i][j] = [j][i]가 되는 형태)
아래 코드로 살펴보자.
class Solution {
func rotate(_ matrix: inout [[Int]]) {
// 계속 쓰일 matrix의 길이 (n*n 형태의 정사각 Matrix)
var cnt = matrix.count - 1
// matrix의 각 행들에 index를 매겨준다.
for (i,m) in matrix.enumerated() {
// 배열의 길이만큼 돌아준다.
for j in 0...cnt {
// diagonal 원소들의 값은 고정이고, 대칭으로 변환되기에 반쪽만 봐준다.
if i > j {
// 값이 변경되니 미리 하나 저장해두고
var temp = matrix[i][j]
// 서로 인덱스 위치를 바꿔준다.
matrix[i][j] = matrix[j][i]
matrix[j][i] = temp
}
}
}
// 행 마다 순서를 역으로 바꿔준다.
for i in 0...cnt {
// matrix가 inout으로 정의되었기에 reversed()가 아닌 reverse()로!
matrix[i].reverse()
}
}
}
[ 프로세스 ]
1. 배열의 길이를 먼저 구한다.
2. enumerated()를 통해 index(행 역할), value로 for문을 돈다.
2-1. 열 역할을 할 j를 설정한다.
2-2. transpose는 대각선 원소들을 고정시킨 체, 대칭으로 값을 바꾸는 것이기에 i > j를 통해 반만 봐준다.
2-3. 미리 값을 저장해두고, 서로 값을 바꾼다.
3. 각 행마다 역으로 순서를 변경해준다.
728x90
반응형