Skip to content

Commit 07b18e7

Browse files
authored
Merge pull request #481 from wogha95/main
[์žฌํ˜ธ] WEEK 07 Solutions
2 parents c25a352 + 570f2da commit 07b18e7

File tree

5 files changed

+373
-0
lines changed

5 files changed

+373
-0
lines changed
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
/**
2+
* TC: O(S)
3+
* right์˜ S๋งŒํผ ์ˆœํšŒ + left์˜ S๋งŒํผ ์ˆœํšŒ
4+
* (๊ฐ ์ˆœํšŒ์˜ ๊ณฑ์ด ์•„๋‹Œ ํ•ฉ์ธ ์ด์œ ๋Š” right ์ˆœํšŒ ๋™์•ˆ left์˜ ์ตœ๋Œ€ ์ˆœํšŒ๊ฐ€ S์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.)
5+
*
6+
* SC: O(S)
7+
* usedCharacter์— S๋งŒํผ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
8+
*
9+
* S: s.length
10+
*/
11+
12+
/**
13+
* @param {string} s
14+
* @return {number}
15+
*/
16+
var lengthOfLongestSubstring = function (s) {
17+
// 1. ์‚ฌ์šฉ๋œ ๋ฌธ์ž๋ฅผ ๊ธฐ๋กํ•˜๊ธฐ ์œ„ํ•œ set
18+
const usedCharacter = new Set();
19+
20+
// 2. ์ •๋‹ต ์ œ์ถœ์„ ์œ„ํ•œ ๋ถ€๋ถ„๋ฌธ์ž์—ด ์ตœ๋Œ€ ๊ธธ์ด
21+
let maxLength = 0;
22+
23+
// 3. ์ˆœํšŒ๋ฅผ ์œ„ํ•œ ํฌ์ธํ„ฐ + ๊ฐ index์—์„œ ์ตœ๋Œ€ ๋ฌธ์ž์—ด๊ธธ์ด๋ฅผ ๊ตฌํ•˜๊ธฐ ์œ„ํ•œ ๋ณ€์ˆ˜
24+
let left = 0;
25+
let right = 0;
26+
27+
while (left <= right && right < s.length) {
28+
// 4. [right] ๋ฌธ์ž๊ฐ€ ์‚ฌ์šฉ๋˜์—ˆ์œผ๋ฉด
29+
if (usedCharacter.has(s[right])) {
30+
// 5. ์‚ฌ์šฉ๋œ ๋ฌธ์ž๋ฅผ ๋ฐœ๊ฒฌํ•˜๊ธฐ ์ „๊นŒ์ง€ left ์ด๋™ (+ ์‚ฌ์šฉ๋œ [left] ๋ฌธ์ž ๊ธฐ๋ก ์ œ๊ฑฐ)
31+
while (s[left] !== s[right]) {
32+
usedCharacter.delete(s[left]);
33+
left += 1;
34+
}
35+
36+
// 6. [right] ๋ฌธ์ž์™€ [left] ๋ฌธ์ž๊ฐ€ ๋™์ผํ•˜๋ฏ€๋กœ left๋งŒ ์ด๋™
37+
left += 1;
38+
} else {
39+
// 7. [right] ๋ฌธ์ž๊ฐ€ ๋ฏธ์‚ฌ์šฉ๋˜์—ˆ์œผ๋ฉด ๊ธฐ๋ก ์ถ”๊ฐ€
40+
usedCharacter.add(s[right]);
41+
}
42+
43+
// 8. ์ค‘๋ณต์—†๋Š” ๋ถ€๋ถ„๋ฌธ์ž์—ด ์ตœ๋Œ€ ๊ธธ์ด ๊ฐฑ์‹ 
44+
maxLength = Math.max(maxLength, right - left + 1);
45+
46+
// 9. ๋‹ค์Œ ๋ฌธ์ž๋กœ ์ด๋™
47+
right += 1;
48+
}
49+
50+
return maxLength;
51+
};

โ€Žnumber-of-islands/wogha95.js

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
/**
2+
* TC: O(ROW * COLUMN)
3+
* ์ฃผ์–ด์ง„ grid ๋ฐฐ์—ด ์ „์ฒด ์ˆœํšŒ + (์ตœ์•…์˜ ๊ฒฝ์šฐ queue์—์„œ grid ์ „์ฒด ์ˆœํšŒ)
4+
*
5+
* SC: O(ROW * COLUMN)
6+
* queue์—์„œ ์ตœ๋Œ€ grid๋งŒํผ ์ˆœํšŒ
7+
*
8+
* ROW: grid.length, COLUMN: grid[0].length
9+
*/
10+
11+
/**
12+
* @param {character[][]} grid
13+
* @return {number}
14+
*/
15+
var numIslands = function (grid) {
16+
const LAND = "1";
17+
const VISITED_LAND = "#";
18+
const ROW = grid.length;
19+
const COLUMN = grid[0].length;
20+
21+
// 1. ์ƒํ•˜์ขŒ์šฐ ๋ฐฉํ–ฅํ‚ค
22+
const DIRECTION = [
23+
{ r: 0, c: 1 },
24+
{ r: 1, c: 0 },
25+
{ r: 0, c: -1 },
26+
{ r: -1, c: 0 },
27+
];
28+
29+
let numberOfIslands = 0;
30+
31+
// 2. ์ „์ฒด ์ˆœํšŒํ•˜๋ฉด์„œ
32+
for (let row = 0; row < ROW; row++) {
33+
for (let column = 0; column < COLUMN; column++) {
34+
// 3. LAND๋ฅผ ๋ฐœ๊ฒฌํ•˜๋ฉด ๋ฐฉ๋ฌธํ•œ ์„ฌ์œผ๋กœ ํ‘œ์‹œ(bfs)ํ•˜๊ณ  ์„ฌ๊ฐฏ์ˆ˜ ๊ฐฑ์‹ 
35+
if (grid[row][column] === LAND) {
36+
bfs(row, column);
37+
numberOfIslands += 1;
38+
}
39+
}
40+
}
41+
42+
return numberOfIslands;
43+
44+
function bfs(startRow, startColumn) {
45+
// 4. ์‹œ์ž‘์ขŒํ‘œ queue์— ๋„ฃ๊ณ  ๋ฐฉ๋ฌธ ํ‘œ์‹œ
46+
const queue = [[startRow, startColumn]];
47+
grid[startRow][startColumn] = VISITED_LAND;
48+
49+
while (queue.length > 0) {
50+
const [row, column] = queue.shift();
51+
52+
// 5. ์ƒํ•˜์ขŒ์šฐ์˜ ์ขŒํ‘œ๋ฅผ ๊ฐ€์ง€๊ณ 
53+
for (const direction of DIRECTION) {
54+
const nextRow = row + direction.r;
55+
const nextColumn = column + direction.c;
56+
57+
// 6. ์œ ํšจํ•œ ์ขŒํ‘œ && ๋ฏธ๋ฐฉ๋ฌธ ์œก์ง€์ธ์ง€ ํ™•์ธ
58+
if (
59+
isValidPosition(nextRow, nextColumn) &&
60+
grid[nextRow][nextColumn] === LAND
61+
) {
62+
// 7. queue์— ์ถ”๊ฐ€ํ•˜๊ณ  ๋ฐฉ๋ฌธ ํ‘œ์‹œ
63+
grid[nextRow][nextColumn] = VISITED_LAND;
64+
queue.push([nextRow, nextColumn]);
65+
}
66+
}
67+
}
68+
}
69+
70+
// 8. ์ฃผ์–ด์ง„ 2์ฐจ์› ๋ฐฐ์—ด์˜ ์œ ํšจํ•œ ์ขŒํ‘œ์ธ์ง€ ํ™•์ธํ•˜๋Š” ํ•จ์ˆ˜
71+
function isValidPosition(row, column) {
72+
if (row < 0 || ROW <= row) {
73+
return false;
74+
}
75+
if (column < 0 || COLUMN <= column) {
76+
return false;
77+
}
78+
return true;
79+
}
80+
};

โ€Žreverse-linked-list/wogha95.js

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
/**
2+
* 2์ฐจ
3+
* Tony๋‹˜ ํ’€์ด ์ฐธ๊ณ ํ•ด์„œ SC ๊ฐœ์„ 
4+
*
5+
* TC: O(N)
6+
* SC: O(1)
7+
* ์ˆœํšŒ๋™์•ˆ ๋…ธ๋“œ ์ƒ์„ฑํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๊ณต๊ฐ„๋ณต์žก๋„๊ฐ€ ์ƒ์ˆ˜๋‹ค.
8+
*
9+
* N: linked-list length
10+
*/
11+
12+
/**
13+
* Definition for singly-linked list.
14+
* function ListNode(val, next) {
15+
* this.val = (val===undefined ? 0 : val)
16+
* this.next = (next===undefined ? null : next)
17+
* }
18+
*/
19+
/**
20+
* @param {ListNode} head
21+
* @return {ListNode}
22+
*/
23+
var reverseList = function (head) {
24+
let pointer = null;
25+
26+
while (head !== null) {
27+
let temp = head.next;
28+
head.next = pointer;
29+
pointer = head;
30+
head = temp;
31+
}
32+
33+
return pointer;
34+
};
35+
36+
/**
37+
* 1์ฐจ
38+
* TC: O(N)
39+
* linked-list ๊ธธ์ด ๋งŒํผ ์ˆœํšŒ
40+
*
41+
* SC: O(N)
42+
* linked-list ๊ธธ์ด๋งŒํผ ์ƒ์„ฑ
43+
*
44+
* N: linked-list length
45+
*/
46+
47+
/**
48+
* Definition for singly-linked list.
49+
* function ListNode(val, next) {
50+
* this.val = (val===undefined ? 0 : val)
51+
* this.next = (next===undefined ? null : next)
52+
* }
53+
*/
54+
/**
55+
* @param {ListNode} head
56+
* @return {ListNode}
57+
*/
58+
var reverseList = function (head) {
59+
let pointer = null;
60+
61+
while (head) {
62+
// 1. ์ •๋‹ต ๋ฆฌ์ŠคํŠธ์˜ ๋งจ ์•ž์— ์ƒˆ๋กœ์šด ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€
63+
pointer = new ListNode(head.val, pointer);
64+
// 2. head๋Š” ๋‹ค์Œ ๋…ธ๋“œ๋กœ ์ด๋™
65+
head = head.next;
66+
}
67+
68+
return pointer;
69+
};

โ€Žset-matrix-zeroes/wogha95.js

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
/**
2+
* TC: O(ROW * COLUMN)
3+
* SC: O(1)
4+
*/
5+
6+
/**
7+
* @param {number[][]} matrix
8+
* @return {void} Do not return anything, modify matrix in-place instead.
9+
*/
10+
var setZeroes = function (matrix) {
11+
const ROW = matrix.length;
12+
const COLUMN = matrix[0].length;
13+
const MARK = "#";
14+
15+
// 1. 0์ธ ์š”์†Œ์˜ ๊ฐ€๋กœ, ์„ธ๋กœ๋ฅผ ํŠน์ •๋ฌธ์ž๋กœ ๋ณ€๊ฒฝ
16+
for (let row = 0; row < ROW; row++) {
17+
for (let column = 0; column < COLUMN; column++) {
18+
if (matrix[row][column] === 0) {
19+
changeToMark(row, column);
20+
}
21+
}
22+
}
23+
24+
// 2. ํŠน์ •๋ฌธ์ž๋ฅผ ๋ชจ๋‘ 0์œผ๋กœ ๋ณ€๊ฒฝ
25+
for (let row = 0; row < ROW; row++) {
26+
for (let column = 0; column < COLUMN; column++) {
27+
if (matrix[row][column] === MARK) {
28+
matrix[row][column] = 0;
29+
}
30+
}
31+
}
32+
33+
// 3. ํŠน์ • ์ขŒํ‘œ์˜ ๊ฐ€๋กœ, ์„ธ๋กœ๋ฅผ char๋ฌธ์ž๋กœ ๋ณ€๊ฒฝ (๋Œ€์‹  0์ธ ์š”์†Œ๋Š” ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Œ)
34+
function changeToMark(row, column) {
35+
for (let r = 0; r < ROW; r++) {
36+
if (matrix[r][column] !== 0) {
37+
matrix[r][column] = MARK;
38+
}
39+
}
40+
for (let c = 0; c < COLUMN; c++) {
41+
if (matrix[row][c] !== 0) {
42+
matrix[row][c] = MARK;
43+
}
44+
}
45+
}
46+
};

โ€Žunique-paths/wogha95.js

Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
/**
2+
* 3์ฐจ (์‹œ๊ฐ„, ๊ณต๊ฐ„ ๋ณต์žก๋„ ๊ฐœ์„ )
3+
* ๋™์ผํ•œ down๋ฐฉํ–ฅ, right๋ฐฉํ–ฅ๋“ค ์ค‘์—์„œ ๋‚˜์—ดํ•˜๋Š” ๋ฐฉ๋ฒ•
4+
* ์ฆ‰, ((m - 1) + (n - 1))! / ((m - 1)! * (n - 1)!)
5+
* (+ ํŒฉํ† ๋ฆฌ์–ผ์˜ ์ˆ˜๋Š” ๋งค์šฐ ๋น ๋ฅด๊ฒŒ ์ปค์ง€๋ฏ€๋กœ ์ค‘๊ฐ„ ๋‚˜๋ˆ—์…ˆ์ด ๊ฐ€๋Šฅํ• ๋•Œ๋งˆ๋‹ค ๋‚˜๋ˆ„์–ด์„œ integer ๋ฒ”์œ„๋ฅผ ๋„˜์ง€ ์•Š๋„๋ก ๋ฐฉ์ง€)
6+
*
7+
* TC: O(M + N)
8+
* 1๋ถ€ํ„ฐ ์ตœ๋Œ€ (M - 1) + (N - 1)๊นŒ์ง€ ์ˆœํšŒ
9+
*
10+
* SC: O(1)
11+
* ๊ณ„์‚ฐ์˜ ๊ฒฐ๊ณผ ๋ณ€์ˆ˜๊ฐ€ m, n๊ณผ ๋ฌด๊ด€ํ•˜๋ฏ€๋กœ ์ƒ์ˆ˜์˜ ๊ณต๊ฐ„๋ณต์žก๋„
12+
*/
13+
14+
/**
15+
* @param {number} m
16+
* @param {number} n
17+
* @return {number}
18+
*/
19+
var uniquePaths = function (m, n) {
20+
// 1. down๋ฐฉํ–ฅ, right๋ฐฉํ–ฅ์˜ ์ˆ˜
21+
const NUMBER_OF_DOWN = m - 1;
22+
const NUMBER_OF_RIGHT = n - 1;
23+
24+
// 2. factorial ๊ณ„์‚ฐ์„ ์œ„ํ•œ ๋ณ€์ˆ˜
25+
let result = 1;
26+
let factorialOfDown = 1;
27+
let factorialOfRight = 1;
28+
29+
// 3. 'down๋ฐฉํ–ฅ ์ˆ˜ + right๋ฐฉํ–ฅ ์ˆ˜'๋งŒํผ ์ˆœํšŒํ•˜๋ฉด์„œ
30+
for (let number = 1; number <= NUMBER_OF_DOWN + NUMBER_OF_RIGHT; number++) {
31+
result *= number;
32+
33+
// 4. factorial ๊ฐ’๋“ค์ด ์ปค์ง€์ง€ ์•Š๋„๋ก ๋‚˜๋ˆŒ์ˆ˜ ์žˆ์„๋•Œ๋งˆ๋‹ค ๋‚˜๋ˆ” (factorial of down)
34+
if (number <= NUMBER_OF_DOWN) {
35+
factorialOfDown *= number;
36+
if (result % factorialOfDown === 0) {
37+
result /= factorialOfDown;
38+
factorialOfDown = 1;
39+
}
40+
}
41+
42+
// 5. factorial ๊ฐ’๋“ค์ด ์ปค์ง€์ง€ ์•Š๋„๋ก ๋‚˜๋ˆŒ์ˆ˜ ์žˆ์„๋•Œ๋งˆ๋‹ค ๋‚˜๋ˆ” (factorial of right)
43+
if (number <= NUMBER_OF_RIGHT) {
44+
factorialOfRight *= number;
45+
if (result % factorialOfRight === 0) {
46+
result /= factorialOfRight;
47+
factorialOfRight = 1;
48+
}
49+
}
50+
}
51+
52+
return result / factorialOfDown / factorialOfRight;
53+
};
54+
55+
/**
56+
* 2์ฐจ (๊ณต๊ฐ„๋ณต์žก๋„ ๊ฐœ์„ )
57+
* ์ด์ „ ํ’€์ด์—์„œ ๋ชจ๋“  ํ–‰์˜ ๊ฒฝ๋กœ์ˆ˜๋ฅผ ๊ธฐ์–ตํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ์ ์„ ํ™œ์šฉ
58+
*
59+
* TC: O(M * N)
60+
* ๊ฒฝ๋กœ ์ˆ˜๋ฅผ ๊ธฐ๋กํ•˜๊ธฐ ์œ„ํ•œ N๋ฐฐ์—ด ์ˆœํšŒ * (M - 1)
61+
*
62+
* SC: O(N)
63+
* ๊ฒฝ๋กœ์ˆ˜ ๊ธฐ๋ก์„ ์œ„ํ•œ 1์ฐจ์› ๋ฐฐ์—ด
64+
*/
65+
66+
/**
67+
* @param {number} m
68+
* @param {number} n
69+
* @return {number}
70+
*/
71+
var uniquePaths = function (m, n) {
72+
// 1. ์ตœ์ƒ๋‹จ์˜ ๊ฒฝ๋กœ์ˆ˜๋Š” ๋ชจ๋‘ 1
73+
const numberOfPaths = new Array(n).fill(1);
74+
75+
for (let row = 1; row < m; row++) {
76+
// 2. ๊ฐ ์ขŒํ‘œ์˜ ๊ฒฝ๋กœ์ˆ˜๋Š” ํ˜„์ขŒํ‘œ(1์ฐจ ํ’€์ด์˜ row-1)์™€ ์ขŒ์ธก์ขŒํ‘œ(1์ฐจ ํ’€์ด์˜ column-1)์˜ ํ•ฉ
77+
for (let column = 1; column < n; column++) {
78+
numberOfPaths[column] += numberOfPaths[column - 1];
79+
}
80+
}
81+
82+
return numberOfPaths[n - 1];
83+
};
84+
85+
/**
86+
* 1์ฐจ
87+
* ๊ฐ ์ขŒํ‘œ์˜ ๊ฒฝ๋กœ์ˆ˜๋ฅผ ๊ธฐ๋กํ•˜์—ฌ dp๋กœ ํ’€์ด
88+
* ํ˜„์ขŒํ‘œ๊นŒ์ง€์˜ ๊ฒฝ๋กœ์ˆ˜ = ์ƒ๋‹จ์ขŒํ‘œ์—์„œ ์˜จ ๊ฒฝ์šฐ + ์ขŒ์ธก์ขŒํ‘œ์—์„œ ์˜จ ๊ฒฝ์šฐ
89+
* dp[row][column] = dp[row - 1][column] + dp[row][column - 1]
90+
*
91+
*
92+
* TC: O(M * N)
93+
* ๊ฒฝ๋กœ์ˆ˜๋ฅผ ๊ธฐ๋กํ•œ 2์ฐจ์› ๋ฐฐ์—ด์„ ์ „์ฒด ์ˆœํšŒ
94+
*
95+
* SC: O(M * N)
96+
* ๊ฒฝ๋กœ์ˆ˜ ๊ธฐ๋ก์„ ์œ„ํ•œ 2์ฐจ์› ๋ฐฐ์—ด
97+
*/
98+
99+
/**
100+
* @param {number} m
101+
* @param {number} n
102+
* @return {number}
103+
*/
104+
var uniquePaths = function (m, n) {
105+
// 1. ๊ฐ ์ขŒ๋ฃŒ๊นŒ์ง€์˜ ๊ฒฝ๋กœ์ˆ˜๋ฅผ ๊ธฐ๋กํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฐ์—ด
106+
const numberOfPaths = new Array(m).fill(new Array(n).fill(0));
107+
108+
// 2. ์ตœ์ขŒ์ธก์— ์žˆ๋Š” ์ขŒํ‘œ์˜ ๊ฒฝ๋กœ์ˆ˜๋Š” 1
109+
for (let row = 0; row < m; row++) {
110+
numberOfPaths[row][0] = 1;
111+
}
112+
113+
// 3. ์ตœ์ƒ๋‹จ์— ์žˆ๋Š” ์ขŒํ‘œ์˜ ๊ฒฝ๋กœ์ˆ˜๋Š” 1
114+
for (let column = 0; column < n; column++) {
115+
numberOfPaths[0][column] = 1;
116+
}
117+
118+
// 4. ๊ทธ ์™ธ ๊ฐ ์ขŒํ‘œ๋Š” ๋ฐ”๋กœ ์œ„ ์ขŒํ‘œ(column-1)์™€ ๋ฐ”๋กœ ์™ผ์ชฝ ์ขŒํ‘œ(row-1)์˜ ๊ฒฝ๋กœ์ˆ˜์˜ ํ•ฉ
119+
for (let row = 1; row < m; row++) {
120+
for (let column = 1; column < n; column++) {
121+
numberOfPaths[row][column] =
122+
numberOfPaths[row - 1][column] + numberOfPaths[row][column - 1];
123+
}
124+
}
125+
126+
return numberOfPaths[m - 1][n - 1];
127+
};

0 commit comments

Comments
ย (0)