👨🏻‍💻iOS 공부/Swift_알고리즘 풀이

[LeetCode] Array (3)

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
반응형