Skip to content

Commit cfc0c46

Browse files
authored
Merge pull request #478 from obzva/main
[Flynn] Week 6 Sprial Matrix Refactor
2 parents 26691e9 + d14eb06 commit cfc0c46

File tree

1 file changed

+68
-1
lines changed

1 file changed

+68
-1
lines changed

spiral-matrix/flynn.cpp

+68-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
* - N: 열의 개수
99
*
1010
* - Time complexity: O(MN)
11-
* - Space complexity: O(1)
11+
* - Space complexity: O(MN)
1212
*/
1313

1414
class Solution {
@@ -56,3 +56,70 @@ class Solution {
5656
return res;
5757
}
5858
};
59+
60+
/**
61+
* 풀이
62+
* - 위와 동일하지만, 방문 여부를 기록하기 위해 m * n 크기의 정수형 2차원 배열 대신
63+
* m 크기의 16비트 정수 배열을 사용합니다
64+
* - 더 이상 입력 배열을 변형하지 않습니다
65+
* - 공간복잡도가 개선되고 실제 공간 사용량도 줄어듭니다
66+
*
67+
* Big O
68+
* - M: 주어진 matrix의 행의 개수
69+
* - N: 열의 개수
70+
*
71+
* - Time complexity: O(MN)
72+
* - Space complexity: O(M)
73+
*/
74+
75+
class Solution {
76+
public:
77+
pair<int, int> rotate(pair<int, int> dir) {
78+
return {dir.second, -dir.first};
79+
}
80+
81+
pair<int, int> get_next(pair<int, int> curr, pair<int, int> dir) {
82+
return {curr.first + dir.first, curr.second + dir.second};
83+
}
84+
85+
void mark_visited(vector<uint16_t>& visit, pair<int, int> curr) {
86+
visit[curr.first] |= 1 << curr.second;
87+
}
88+
89+
bool is_visited(vector<uint16_t> const visit, pair<int, int> curr) {
90+
return visit[curr.first] & 1 << curr.second;
91+
}
92+
93+
vector<int> spiralOrder(vector<vector<int>>& matrix) {
94+
int m = matrix.size();
95+
int n = matrix[0].size();
96+
int cnt = m * n;
97+
98+
pair<int, int> curr = {0, 0};
99+
pair<int, int> curr_dir = {0, 1};
100+
101+
vector<uint16_t> visit(m, 0);
102+
103+
vector<int> res;
104+
105+
while (cnt) {
106+
res.push_back(matrix[curr.first][curr.second]);
107+
108+
mark_visited(visit, curr);
109+
--cnt;
110+
111+
pair<int, int> next = get_next(curr, curr_dir);
112+
113+
if (0 > next.first || next.first >= m
114+
|| 0 > next.second || next.second >= n
115+
|| is_visited(visit, next)) {
116+
curr_dir = rotate(curr_dir);
117+
curr = get_next(curr, curr_dir);
118+
} else {
119+
curr = next;
120+
}
121+
}
122+
123+
return res;
124+
}
125+
};

0 commit comments

Comments
 (0)