Skip to content

Commit 5fcfcef

Browse files
committed
solve: spiral matrix
1 parent b80c227 commit 5fcfcef

File tree

1 file changed

+140
-0
lines changed

1 file changed

+140
-0
lines changed

โ€Žspiral-matrix/wogha95.jsโ€Ž

Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
/**
2+
* 2์ฐจ ํ’€์ด: ๊ธฐ์กด matrix ๋ณ€๊ฒฝ ์—†๋„๋ก ๊ฐœ์„ 
3+
*
4+
* TC: O(ROW * COLUMN)
5+
* matrix ์ „์ฒด ์ˆœํšŒ 1ํšŒ
6+
*
7+
* SC: O(ROW * COLUMN)
8+
* ์ •๋‹ต ์ œ์ถœ์„ ์œ„ํ•œ result ๊ณต๊ฐ„๋ณต์žก๋„
9+
*/
10+
11+
/**
12+
* @param {number[][]} matrix
13+
* @return {number[]}
14+
*/
15+
var spiralOrder = function (matrix) {
16+
const ROW = matrix.length;
17+
const COLUMN = matrix[0].length;
18+
// 1. ์ƒํ•˜์ขŒ์šฐ ์‹œ์ž‘๋ index๋ฅผ ์ €์žฅํ•จ
19+
const boundary = {
20+
top: 0,
21+
bottom: ROW - 1,
22+
left: 0,
23+
right: COLUMN - 1,
24+
};
25+
const result = [];
26+
27+
while (result.length < ROW * COLUMN) {
28+
// 2. ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ˆœํšŒ
29+
for (let column = boundary.left; column <= boundary.right; column++) {
30+
result.push(matrix[boundary.top][column]);
31+
}
32+
boundary.top += 1;
33+
34+
// 3. ์•„๋ž˜๋กœ ์ˆœํšŒ
35+
for (let row = boundary.top; row <= boundary.bottom; row++) {
36+
result.push(matrix[row][boundary.right]);
37+
}
38+
boundary.right -= 1;
39+
40+
// 4. ๋ชจ๋‘ ์ˆœํšŒํ–ˆ๋Š”๋ฐ ์™”๋˜๊ธธ ๋˜๋Œ์•„๊ฐ€๋Š” ๊ฒฝ์šฐ๋ฅผ ๋ง‰๊ธฐ์œ„ํ•ด ์ค‘๊ฐ„ ์กฐ๊ฑด๋ฌธ ์ถ”๊ฐ€
41+
if (result.length === ROW * COLUMN) {
42+
break;
43+
}
44+
45+
// 5. ์™ผ์ชฝ์œผ๋กœ ์ˆœํšŒ
46+
for (let column = boundary.right; column >= boundary.left; column--) {
47+
result.push(matrix[boundary.bottom][column]);
48+
}
49+
boundary.bottom -= 1;
50+
51+
// 6. ์œ„์ชฝ์œผ๋กœ ์ˆœํšŒ
52+
for (let row = boundary.bottom; row >= boundary.top; row--) {
53+
result.push(matrix[row][boundary.left]);
54+
}
55+
boundary.left += 1;
56+
}
57+
58+
return result;
59+
};
60+
61+
/**
62+
* 1์ฐจ ํ’€์ด
63+
*
64+
* TC: O(ROW * COLUMN)
65+
* matrix ์ „์ฒด ์ˆœํšŒ 1ํšŒ
66+
*
67+
* SC: O(ROW * COLUMN)
68+
* ์ •๋‹ต ์ œ์ถœ์„ ์œ„ํ•œ result ๊ณต๊ฐ„๋ณต์žก๋„
69+
*/
70+
71+
/**
72+
* @param {number[][]} matrix
73+
* @return {number[]}
74+
*/
75+
var spiralOrder = function (matrix) {
76+
const ROW = matrix.length;
77+
const COLUMN = matrix[0].length;
78+
// ์šฐํ•˜์ขŒ์ƒ ์ˆœ์„œ
79+
const DIRECTION = [
80+
{
81+
row: 0,
82+
column: 1,
83+
},
84+
{
85+
row: 1,
86+
column: 0,
87+
},
88+
{
89+
row: 0,
90+
column: -1,
91+
},
92+
{
93+
row: -1,
94+
column: 0,
95+
},
96+
];
97+
98+
// 1. ์ฒซ ์‹œ์ž‘์  ๋ฐฉ๋ฌธํ‘œ์‹œ
99+
const result = [matrix[0][0]];
100+
matrix[0][0] = "#";
101+
102+
let current = {
103+
row: 0,
104+
column: 0,
105+
};
106+
let directionIndex = 0;
107+
108+
// 2. ์ด ๊ฐฏ์ˆ˜๋งŒํผ ์ฑ„์›Œ์งˆ๋•Œ๊นŒ์ง€ ์ˆœํšŒ
109+
while (result.length < ROW * COLUMN) {
110+
const next = {
111+
row: current.row + DIRECTION[directionIndex].row,
112+
column: current.column + DIRECTION[directionIndex].column,
113+
};
114+
// 3. ๋‹ค์Œ ์ˆœํšŒํ•  ๊ณณ์ด ์œ ํšจํ•œ ์ขŒํ‘œ์ธ์ง€ ๋ฐฉ๋ฌธํ•œ ๊ณณ์ธ์ง€ ํ™•์ธ
115+
if (
116+
!isValidPosition(next.row, next.column) ||
117+
matrix[next.row][next.column] === "#"
118+
) {
119+
// 4. ๋ฐฉํ–ฅ ์ „ํ™˜
120+
directionIndex = (directionIndex + 1) % 4;
121+
} else {
122+
// 5. ๋ฐฉ๋ฌธ ํ‘œ์‹œ ํ›„ ๋‹ค์Œ ์ขŒํ‘œ๋กœ ์ด๋™
123+
result.push(matrix[next.row][next.column]);
124+
matrix[next.row][next.column] = "#";
125+
current = next;
126+
}
127+
}
128+
129+
return result;
130+
131+
function isValidPosition(row, column) {
132+
if (row < 0 || ROW <= row) {
133+
return false;
134+
}
135+
if (column < 0 || COLUMN <= column) {
136+
return false;
137+
}
138+
return true;
139+
}
140+
};

0 commit comments

Comments
ย (0)