Skip to content

Commit

Permalink
Merge pull request #941 from mmyeon/main
Browse files Browse the repository at this point in the history
[mallayon] Week 7
  • Loading branch information
mmyeon authored Jan 24, 2025
2 parents 89edeec + 0527960 commit 6d1380b
Show file tree
Hide file tree
Showing 5 changed files with 279 additions and 0 deletions.
55 changes: 55 additions & 0 deletions longest-substring-without-repeating-characters/mmyeon.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
/**
*@link https://leetcode.com/problems/longest-substring-without-repeating-characters/description/
*
* ์ ‘๊ทผ ๋ฐฉ๋ฒ• :
* - ์Šฌ๋ผ์šฐ๋”ฉ ์œˆ๋„์šฐ์™€ set ์‚ฌ์šฉํ•ด์„œ ์ค‘๋ณต์—†๋Š” ๋ฌธ์ž์—ด ํ™•์ธ
* - ์ค‘๋ณต ๋ฌธ์ž ๋ฐœ๊ฒฌํ•˜๋ฉด ์œˆ๋„์šฐ ์ถ•์†Œ
*
* ์‹œ๊ฐ„๋ณต์žก๋„ : O(n)
* - ๊ฐ ๋ฌธ์ž ์ˆœํšŒํ•˜๋‹ˆ๊นŒ
*
* ๊ณต๊ฐ„๋ณต์žก๋„ : O(n)
* - ์ค‘๋ณต ์—†๋Š” ๊ฒฝ์šฐ ์ตœ๋Œ€ n๊ฐœ์˜ ๋ฌธ์ž set์— ์ €์žฅ
*/
function lengthOfLongestSubstring(s: string): number {
let start = 0,
end = 0,
maxLength = 0;
const set = new Set<string>();

while (end < s.length) {
const char = s[end];

// ์ค‘๋ณต์ด ์žˆ์œผ๋ฉด ์œˆ๋„์šฐ ์ถ•์†Œ
if (set.has(char)) {
set.delete(s[start]);
start++;
} else {
// ์ค‘๋ณต ์—†์œผ๋ฉด set์— ๋ฌธ์ž ์ถ”๊ฐ€, ์œˆ๋„์šฐ ํ™•์žฅ
set.add(char);
maxLength = Math.max(maxLength, end - start + 1);
end++;
}
}

return maxLength;
}

// Map ์‚ฌ์šฉํ•ด์„œ ์ค‘๋ณต ๋ฐœ์ƒ์‹œ start ์ธ๋ฑ์Šค๊ฐ€ ์ ํ”„ํ•˜๋„๋ก ๊ฐœ์„ 
function lengthOfLongestSubstring(s: string): number {
let start = 0,
maxLength = 0;
const map = new Map<string, number>();

for (let i = 0; i < s.length; i++) {
const char = s[i];
// ์ค‘๋ณต ์žˆ๋Š” ๊ฒฝ์šฐ, ์ค‘๋ณต๋ฌธ์ž์˜ ๋‹ค์Œ ์œ„์น˜๋กœ ์ ํ”„
if (map.has(char)) start = Math.max(start, map.get(char)! + 1);
// ์ธ๋ฑ์Šค ๊ฐฑ์‹ 
map.set(char, i);

maxLength = Math.max(maxLength, i - start + 1);
}

return maxLength;
}
60 changes: 60 additions & 0 deletions number-of-islands/mmyeon.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
/**
*@link https://leetcode.com/problems/number-of-islands/
*
* ์ ‘๊ทผ ๋ฐฉ๋ฒ• :
* - ์„ฌ์˜ ์‹œ์ž‘์ ์—์„œ ๋๊นŒ์ง€ ํƒ์ƒ‰ํ•ด์•ผ ํ•˜๋ฏ€๋กœ DFS ์‚ฌ์šฉ
* - ๋ฐฉ๋ฌธํ•œ ์„ฌ์€ ์ค‘๋ณต ํƒ์ƒ‰ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ฐฉ๋ฌธ ํ›„ ๊ฐ’ ๋ณ€๊ฒฝ ์ฒ˜๋ฆฌ
*
* ์‹œ๊ฐ„๋ณต์žก๋„ : O(m * n)
* - 2์ฐจ์› ๋ฐฐ์—ด ์ „์ฒด๋ฅผ ์ˆœํšŒํ•˜๋ฏ€๋กœ O(m * n)
*
* ๊ณต๊ฐ„๋ณต์žก๋„ : O(m * n)
* - DFS ํ˜ธ์ถœ ์Šคํƒ ์ตœ๋Œ€ ๊นŠ์ด๊ฐ€ m * n ๋งŒํผ ์Œ“์ผ ์ˆ˜ ์žˆ๋‹ค.
*/

function numIslands(grid: string[][]): number {
let count = 0;
const rows = grid.length;
const cols = grid[0].length;

// ์ƒํ•˜์ขŒ์šฐ ํƒ์ƒ‰ ๋ฐฉํ–ฅ ๋ฐฐ์—ด
const directions = [
[0, -1],
[0, 1],
[-1, 0],
[1, 0],
];

// ํ˜„์žฌ ์œ„์น˜์—์„œ ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ์„ฌ ํƒ์ƒ‰
const dfs = (row: number, col: number) => {
// ์ข…๋ฃŒ ์กฐ๊ฑด : ๋ฒ”์œ„ ๋ฒ—์–ด๋‚˜๊ฑฐ๋‚˜, ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ๊ฒฝ์šฐ
if (
row < 0 ||
row >= rows ||
col < 0 ||
col >= cols ||
grid[row][col] === "0"
)
return;

// ํ˜„์žฌ ์œ„์น˜ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
grid[row][col] = "0";

// ์ƒํ•˜์ขŒ์šฐ ํƒ์ƒ‰
for (const [x, y] of directions) {
dfs(row + x, col + y);
}
};

for (let row = 0; row < rows; row++) {
for (let col = 0; col < cols; col++) {
// ์„ฌ์˜ ์‹œ์ž‘์ ์ธ ๊ฒฝ์šฐ
if (grid[row][col] === "1") {
count++;
dfs(row, col);
}
}
}

return count;
}
37 changes: 37 additions & 0 deletions reverse-linked-list/mmyeon.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
class ListNode {
val: number;
next: ListNode | null;
constructor(val?: number, next?: ListNode | null) {
this.val = val === undefined ? 0 : val;
this.next = next === undefined ? null : next;
}
}

/**
*
* @link https://leetcode.com/problems/reverse-linked-list/
*
* ์ ‘๊ทผ ๋ฐฉ๋ฒ• :
* - ๋ฆฌ์ŠคํŠธ ์ˆœํšŒํ•˜๋ฉด์„œ ์ƒˆ๋กœ์šด ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ธฐ์กด reversed ๋ฆฌ์ŠคํŠธ์˜ head๋ฅผ ์—ฐ๊ฒฐ
*
* ์‹œ๊ฐ„๋ณต์žก๋„ : O(n)
* - ๋ฆฌ์ŠคํŠธ ๋…ธ๋“œ 1ํšŒ ์ˆœํšŒํ•˜๋‹ˆ๊นŒ
*
* ๊ณต๊ฐ„๋ณต์žก๋„ : O(n)
* - reversed ๋œ ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ ์ƒˆ๋กœ ๋งŒ๋“œ๋‹ˆ๊นŒ
*/

function reverseList(head: ListNode | null): ListNode | null {
if (head === null) return head;

let headNode: ListNode | null = null;
let currentNode: ListNode | null = head;

while (currentNode !== null) {
const newNode = new ListNode(currentNode.val, headNode);
headNode = newNode;
currentNode = currentNode.next;
}

return headNode;
}
88 changes: 88 additions & 0 deletions set-matrix-zeroes/mmyeon.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
/**
Do not return anything, modify matrix in-place instead.
*/
/**
* @link https://leetcode.com/problems/set-matrix-zeroes/description/
*
* ์ ‘๊ทผ ๋ฐฉ๋ฒ• :
* - ํ–‰๋ ฌ ์ˆœํšŒํ•˜๋ฉด์„œ 0์ด ์žˆ๋Š” ํ–‰๊ณผ ์—ด์„ rowsToZero๊ณผ colsToZero์— ์ €์žฅ
* - ๋‹ค์‹œ ํ–‰๋ ฌ ์ˆœํšŒํ•˜๋ฉด์„œ rowsToZero๊ณผ colsToZero์™€ ํฌํ•จ๋œ ๊ฒฝ์šฐ 0์œผ๋กœ ๋ณ€๊ฒฝ
*
* ์‹œ๊ฐ„๋ณต์žก๋„ : O(m * n)
* - m * n ํ–‰๋ ฌ ํฌ๊ธฐ๋งŒํผ ์ˆœํšŒ
*
* ๊ณต๊ฐ„๋ณต์žก๋„ : O(m + n)
* - m ํ–‰๊ณผ n ์—ด ์ •๋ณด ์ €์žฅ
*/
function setZeroes(matrix: number[][]): void {
const rows = matrix.length;
const cols = matrix[0].length;
const rowsToZero = new Set<number>();
const colsToZero = new Set<number>();
for (let row = 0; row < rows; row++) {
for (let col = 0; col < cols; col++) {
if (matrix[row][col] === 0) {
rowsToZero.add(row);
colsToZero.add(col);
}
}
}

for (let row = 0; row < rows; row++) {
for (let col = 0; col < cols; col++) {
if (rowsToZero.has(row) || colsToZero.has(col)) {
matrix[row][col] = 0;
}
}
}
}

// ๊ณต๊ฐ„ ๋ณต์žก๋„ O(m+n)์„ O(1)๋กœ ๊ฐœ์„ ํ•˜๊ธฐ
// set์— ํ–‰๊ณผ ์—ด ์ •๋ณด ์ €์žฅํ•˜๋˜ ๋ฐฉ์‹์„ set์—†์ด ์ฒซ ๋ฒˆ์งธ ํ–‰๊ณผ ์—ด์„ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ๋ณ€๊ฒฝ
function setZeroes(matrix: number[][]): void {
const rows = matrix.length;
const cols = matrix[0].length;
let hasZeroInFirstRow = false;
let hasZeroInFirstCol = false;

// ์ฒซ ๋ฒˆ์งธ ์—ด์— 0 ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํ”Œ๋ž˜๊ทธ๋กœ ์ €์žฅ
for (let row = 0; row < rows; row++) {
if (matrix[row][0] === 0) hasZeroInFirstCol = true;
}

// ์ฒซ ๋ฒˆ์งธ ํ–‰์— 0 ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํ”Œ๋ž˜๊ทธ๋กœ ์ €์žฅ
for (let col = 0; col < cols; col++) {
if (matrix[0][col] === 0) hasZeroInFirstRow = true;
}

// ์ฒซ ๋ฒˆ์งธ ํ–‰๊ณผ ์—ด ์ œ์™ธํ•˜๊ณ  ๋งˆ์ปค ์„ค์ •ํ•˜๊ธฐ
for (let row = 1; row < rows; row++) {
for (let col = 1; col < cols; col++) {
if (matrix[row][col] === 0) {
matrix[0][col] = 0;
matrix[row][0] = 0;
}
}
}

// ๋งˆ์ปค ๊ธฐ๋ฐ˜์œผ๋กœ ํ–‰๋ ฌ์— ๋ฐ˜์˜
for (let row = 1; row < rows; row++) {
for (let col = 1; col < cols; col++) {
if (matrix[row][0] === 0 || matrix[0][col] === 0) matrix[row][col] = 0;
}
}

// ์ฒซ ๋ฒˆ์งธ ํ–‰ ์—…๋ฐ์ดํŠธ
if (hasZeroInFirstRow) {
for (let col = 0; col < cols; col++) {
matrix[0][col] = 0;
}
}

// ์ฒซ ๋ฒˆ์งธ ์—ด ์—…๋ฐ์ดํŠธ
if (hasZeroInFirstCol) {
for (let row = 0; row < rows; row++) {
matrix[row][0] = 0;
}
}
}
39 changes: 39 additions & 0 deletions unique-paths/mmyeon.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
/**
* @link https://leetcode.com/problems/unique-paths/
*
* ์ ‘๊ทผ ๋ฐฉ๋ฒ• :
* - ์‹œ์ž‘๋ถ€ํ„ฐ ๋๊นŒ์ง€ ๋ˆ„์ ๋œ ๊ฒฝ๋กœ์˜ ์ˆ˜ ์ฐพ์•„์•ผ ํ•˜๋‹ˆ๊นŒ dp ์‚ฌ์šฉ
* - ์ฒซ ๋ฒˆ์งธ ํ–‰๊ณผ, ์ฒซ ๋ฒˆ์งธ ์—ด์€ 1๋กœ ๊ณ ์ •์ด๋ผ์„œ dp ๋ฐฐ์—ด์„ 1๋กœ ์ดˆ๊ธฐํ™”ํ•จ
* - ์ ํ™”์‹ : dp[x][y] = dp[x-1][y] + dp[x][y-1]
*
* ์‹œ๊ฐ„๋ณต์žก๋„ : O(m * n)
* - m * n ํ–‰๋ ฌ ํฌ๊ธฐ๋งŒํผ ์ˆœํšŒํ•˜๋‹ˆ๊นŒ O(m * n)
*
* ๊ณต๊ฐ„๋ณต์žก๋„ : O(m * n)
* - ์ฃผ์–ด์ง„ ํ–‰๋ ฌ ํฌ๊ธฐ๋งŒํผ dp ๋ฐฐ์—ด์— ๊ฐ’ ์ €์žฅํ•˜๋‹ˆ๊นŒ O(m * n)
*/
function uniquePaths(m: number, n: number): number {
// m x n ๋ฐฐ์—ด ์„ ์–ธ
const dp = Array.from({ length: m }, () => Array(n).fill(1));

for (let i = 1; i < m; i++) {
for (let j = 1; j < n; j++) {
dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
}
}

return dp[m - 1][n - 1];
}

// ๊ณต๊ฐ„ ๋ณต์žก๋„๋ฅผ O(n)์œผ๋กœ ์ตœ์ ํ™”ํ•˜๊ธฐ ์œ„ํ•ด์„œ 1์ฐจ์› dp ๋ฐฐ์—ด ์‚ฌ์šฉ
function uniquePaths(m: number, n: number): number {
const rows = Array(n).fill(1);

for (let i = 1; i < m; i++) {
for (let j = 1; j < n; j++) {
rows[j] = rows[j] + rows[j - 1];
}
}

return rows[n - 1];
}

0 comments on commit 6d1380b

Please sign in to comment.