알고리즘/알고리즘 문제풀이
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
}
}