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)