알고리즘/알고리즘 문제풀이

matrix_Leetcode_54. Spiral Matrix

Downey 2025. 4. 14. 17:42

https://leetcode.com/problems/spiral-matrix/description/?envType=study-plan-v2&envId=top-100-liked

 

문제접근

1. DFS를 사용하여 matrix 탐색

2. Flag를 사용하여 matrix 탐색

위 두 방법을 썼을 때에, 최소 O(mn) ( 어찌 되었든 모든 cell을 방문해야 함 )

 

줄단위 처리를 고민하며 아래 코드를 작성

특정 경우에 줄단위 처리를 하여 조금 더 빠를 수도 있음!

 

spiral을 제어하는 move같은경우 enum으로 작성하면 더 좋을 수 있지만,

귀찮았기 때문에,,,,

정답코드

0msBeats100.00%

19.73MBBeats41.55% -> 0.6MB 차이

더보기
class Solution {
    func spiralOrder(_ matrix: [[Int]]) -> [Int] {
        var curr = matrix {
            didSet {
                curr = curr.compactMap { 
                    if $0.isEmpty { return nil } 
                    else { return $0 } 
                }
            }
        }
        // 0,1,2,3
        var move = 0
        var sol = [Int]()
        while !curr.isEmpty {
            switch move {
                case 0:
                    let line = curr.removeFirst()
                    sol.append(contentsOf: line)
                    move += 1
                case 1:
                var _curr = curr
                    var verticalLine = [Int]()
                    for i in 0..<curr.count {
                        guard !curr[i].isEmpty else { continue }
                        let value = _curr[i].removeLast()
                        verticalLine.append(value)
                    }
                    sol.append(contentsOf: verticalLine)
                    curr = _curr
                    move += 1
                case 2:
                    let reversedHorizontal = curr.removeLast().reversed()
                    sol.append(contentsOf: reversedHorizontal)
                    move += 1
                case 3:
                    var reversedVerticalFirstLine = [Int]()
                    for i in (0..<curr.count).reversed() {
                        let ele = curr[i].removeFirst()
                        reversedVerticalFirstLine.append(ele)
                    }
                    sol.append(contentsOf: reversedVerticalFirstLine)
                    move = 0
                default: break
            }
        }

        return sol
        
    }
}