From 7881b80cd943b11ea53eb02868fc767f716fcad8 Mon Sep 17 00:00:00 2001 From: obzva Date: Sat, 21 Sep 2024 00:30:06 +0900 Subject: [PATCH 1/2] Fix: Spiral Matrix --- spiral-matrix/flynn.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spiral-matrix/flynn.cpp b/spiral-matrix/flynn.cpp index 5f506ddea..b4bba80d5 100644 --- a/spiral-matrix/flynn.cpp +++ b/spiral-matrix/flynn.cpp @@ -8,7 +8,7 @@ * - N: 열의 개수 * * - Time complexity: O(MN) - * - Space complexity: O(1) + * - Space complexity: O(MN) */ class Solution { From d14eb06d8c8eb1bc96c5879a6260e8690c7a64df Mon Sep 17 00:00:00 2001 From: obzva Date: Sat, 21 Sep 2024 00:44:32 +0900 Subject: [PATCH 2/2] Refactor: Spiral Matrix --- spiral-matrix/flynn.cpp | 67 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/spiral-matrix/flynn.cpp b/spiral-matrix/flynn.cpp index b4bba80d5..cd9765431 100644 --- a/spiral-matrix/flynn.cpp +++ b/spiral-matrix/flynn.cpp @@ -56,3 +56,70 @@ class Solution { return res; } }; + +/** + * 풀이 + * - 위와 동일하지만, 방문 여부를 기록하기 위해 m * n 크기의 정수형 2차원 배열 대신 + * m 크기의 16비트 정수 배열을 사용합니다 + * - 더 이상 입력 배열을 변형하지 않습니다 + * - 공간복잡도가 개선되고 실제 공간 사용량도 줄어듭니다 + * + * Big O + * - M: 주어진 matrix의 행의 개수 + * - N: 열의 개수 + * + * - Time complexity: O(MN) + * - Space complexity: O(M) + */ + +class Solution { +public: + pair rotate(pair dir) { + return {dir.second, -dir.first}; + } + + pair get_next(pair curr, pair dir) { + return {curr.first + dir.first, curr.second + dir.second}; + } + + void mark_visited(vector& visit, pair curr) { + visit[curr.first] |= 1 << curr.second; + } + + bool is_visited(vector const visit, pair curr) { + return visit[curr.first] & 1 << curr.second; + } + + vector spiralOrder(vector>& matrix) { + int m = matrix.size(); + int n = matrix[0].size(); + int cnt = m * n; + + pair curr = {0, 0}; + pair curr_dir = {0, 1}; + + vector visit(m, 0); + + vector res; + + while (cnt) { + res.push_back(matrix[curr.first][curr.second]); + + mark_visited(visit, curr); + --cnt; + + pair next = get_next(curr, curr_dir); + + if (0 > next.first || next.first >= m + || 0 > next.second || next.second >= n + || is_visited(visit, next)) { + curr_dir = rotate(curr_dir); + curr = get_next(curr, curr_dir); + } else { + curr = next; + } + } + + return res; + } +};