Skip to content

Commit e97a84e

Browse files
authored
Merge pull request #829 from Yjason-K/main
[gomgom22] Week4
2 parents 5b454a8 + 07fa579 commit e97a84e

File tree

5 files changed

+242
-0
lines changed

5 files changed

+242
-0
lines changed

โ€Žcoin-change/Yjason-K.ts

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
/**
2+
* ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋™์ „์„ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•˜์—ฌ ์ตœ์†Œ์˜ ์กฐํ•ฉ์œผ๋กœ amount๋ฅผ ๋งŒ๋“œ๋Š” ์ตœ์†Œ ๋™์ „ ๊ฐœ์ˆ˜ ๊ตฌํ•˜๋Š” ํ•จ์ˆ˜
3+
*
4+
* @param {number[]} coins - ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋™์ „ ๋ฐฐ์—ด
5+
* @param {number} amount - ๋งŒ๋“ค์–ด์•ผ ํ•˜๋Š” ์ดํ•ฉ
6+
* @returns {number}
7+
*
8+
* ์‹œ๊ฐ„ ๋ณต์žก๋„ O(n * m)
9+
* - n์€ ๋™์ „ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ
10+
* - m์€ amount
11+
*
12+
* ๊ณต๊ฐ„ ๋ณต์žก๋„ (n);
13+
* - ํ์— ์ตœ๋Œ€ n๊ฐœ์˜ ์š”์†Œ๊ฐ€ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ์Œ
14+
*/
15+
function coinChange(coins: number[], amount: number): number {
16+
// ์ดํ•ฉ์ด 0์ธ ๊ฒฝ์šฐ 0 ๋ฐ˜ํ™˜
17+
if (amount === 0) return 0;
18+
19+
// ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰์„ ํ™œ์šฉํ•œ ํ’€์ด
20+
21+
const queue: [number, number] [] = [[0, 0]]; // [ํ˜„์žฌ ์ดํ•ฉ, ๊นŠ์ด]
22+
const visited = new Set<number>();
23+
24+
while (queue.length > 0) {
25+
const [currentSum, depth] = queue.shift()!;
26+
27+
// ๋™์ „์„ ํ•˜๋‚˜์”ฉ ๋”ํ•ด์„œ ๋‹ค์Œ ๊นŠ์ด์„ ํƒ์ƒ‰
28+
for (const coin of coins) {
29+
const nextSum = currentSum + coin;
30+
31+
// ๋ชฉํ‘œ ๊ธˆ์•ก์— ๋„๋‹ฌํ•˜๋ฉด ํ˜„์žฌ ๊นŠ์ด๋ฅผ ๋ฐ˜ํ™˜
32+
if (nextSum === amount) return depth + 1;
33+
34+
// ์•„์ง ์ดํ•ฉ์— ๋„๋‹ฌํ•˜์ง€ ์•Š์•˜๊ณ , ์ค‘๋ณต๋˜์ง€ ์•Š์•„ ํƒ์ƒ‰ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ
35+
if (nextSum < amount && !visited.has(nextSum)) {
36+
queue.push([nextSum, depth + 1]);
37+
visited.add(nextSum)
38+
}
39+
40+
}
41+
}
42+
43+
// ํƒ์ƒ‰ ์กฐ๊ฑด์„ ์™„๋ฃŒ ํ•ด๋„ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์ฐพ์ง€ ๋ชปํ•œ ๊ฒฝ์šฐ
44+
return -1;
45+
}
46+
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
class ListNode {
2+
val: number
3+
next: ListNode | null
4+
constructor(val?: number, next?: ListNode | null) {
5+
this.val = (val===undefined ? 0 : val)
6+
this.next = (next===undefined ? null : next)
7+
}
8+
}
9+
10+
/**
11+
* ๋‘ ๊ฐœ์˜ ์ •๋ ฌ๋œ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ณ‘ํ•ฉํ•˜์—ฌ ํ•˜๋‚˜์˜ ์ •๋ ฌ๋œ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜
12+
* @param {ListNode | null} list1 - ์ฒซ ๋ฒˆ์งธ ์ •๋ ฌ๋œ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ
13+
* @param {ListNode | null} list2 - ๋‘ ๋ฒˆ์งธ ์ •๋ ฌ๋œ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ
14+
* @returns {ListNode | null} - ๋ณ‘ํ•ฉ๋œ ์ •๋ ฌ๋œ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ
15+
*
16+
* ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n + m)
17+
* - n: list1์˜ ๋…ธ๋“œ ๊ฐœ์ˆ˜
18+
* - m: list2์˜ ๋…ธ๋“œ ๊ฐœ์ˆ˜
19+
*
20+
* ๊ณต๊ฐ„ ๋ณต์žก๋„: O(1)
21+
* - ์ƒˆ๋กœ์šด ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ๊ธฐ์กด ๋…ธ๋“œ์˜ ํฌ์ธํ„ฐ๋ฅผ ์กฐ์ •ํ•˜์—ฌ ๋ณ‘ํ•ฉํ•˜๋ฏ€๋กœ ์ถ”๊ฐ€ ๊ณต๊ฐ„ ์‚ฌ์šฉ ์—†์Œ
22+
*/
23+
24+
function mergeTwoLists(list1: ListNode | null, list2: ListNode | null): ListNode | null {
25+
// null ์˜ˆ์™ธ ์ฒ˜๋ฆฌ
26+
if (!list1 || !list2) return list1 || list2;
27+
28+
// ์‹œ์ž‘์ ์„ ์œ„ํ•œ ๋”๋ฏธ ํ—ค๋“œ ๋…ธ๋“œ ์ƒ์„ฑ
29+
const start = new ListNode(-101);
30+
let current = start;
31+
32+
// ๋‘ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ๋น„๊ตํ•˜๋ฉฐ ๋ณ‘ํ•ฉ
33+
while (list1 !== null && list2 !== null) {
34+
if (list1.val <= list2.val) {
35+
current.next = list1;
36+
list1 = list1.next;
37+
} else {
38+
current.next = list2;
39+
list2 = list2.next;
40+
}
41+
current = current.next;
42+
}
43+
44+
// ๋‚จ์€ ๋…ธ๋“œ๋ฅผ ์—ฐ๊ฒฐ (list1 ๋˜๋Š” list2 ์ค‘ ํ•˜๋‚˜๋Š” null ์ƒํƒœ)
45+
current.next = list1 !== null ? list1 : list2;
46+
47+
// ๋”๋ฏธ ํ—ค๋“œ์˜ ๋‹ค์Œ ๋…ธ๋“œ๊ฐ€ ์‹ค์ œ ๋ณ‘ํ•ฉ๋œ ๋ฆฌ์ŠคํŠธ์˜ ์‹œ์ž‘
48+
return start.next;
49+
}

โ€Žmissing-number/Yjason-K.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
/**
2+
* 0๋ถ€ํ„ฐ n๊นŒ์ง€์˜ ์ˆซ์ž ์ค‘ ๋ฐฐ์—ด์—์„œ ๋ˆ„๋ฝ๋œ ์ˆซ์ž๋ฅผ ์ฐพ๋Š” ํ•จ์ˆ˜
3+
* @param {number[]} nums - 0๋ถ€ํ„ฐ n๊นŒ์ง€์˜ ์ˆซ์ž๊ฐ€ ํฌํ•จ๋œ ๋ฐฐ์—ด (์ˆœ์„œ๋Š” ๋ฌด์ž‘์œ„์ด๋ฉฐ ์ผ๋ถ€ ์ˆซ์ž๊ฐ€ ๋ˆ„๋ฝ๋  ์ˆ˜ ์žˆ์Œ)
4+
* @returns {number} - ๋ฐฐ์—ด์—์„œ ๋ˆ„๋ฝ๋œ ์ˆซ์ž
5+
*
6+
* ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n)
7+
* - Set์€ Hash Table๋กœ ๊ตฌํ˜„๋˜์–ด has ๋ฉ”์„œ๋“œ๊ฐ€ Array.includes ๋ฉ”์„œ๋“œ๋ณด๋‹ค ์œ ๋ฆฌ
8+
* - Set์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐ O(n) ์‹œ๊ฐ„์ด ์†Œ์š”
9+
* - ๋ฐฐ์—ด ๊ธธ์ด๋งŒํผ ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ฉด์„œ Set์˜ ์กด์žฌ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๋Š” ๋ฐ O(1) * n = O(n)
10+
* - ๊ฒฐ๊ณผ์ ์œผ๋กœ O(n) + O(n) = O(n)
11+
*
12+
* ๊ณต๊ฐ„ ๋ณต์žก๋„: O(n)
13+
* - Set ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž…๋ ฅ ๋ฐฐ์—ด์˜ ๋ชจ๋“  ์š”์†Œ๋ฅผ ์ €์žฅํ•˜๋ฏ€๋กœ O(n)์˜ ์ถ”๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ
14+
*/
15+
function missingNumber(nums: number[]): number {
16+
// ๋ฐฐ์—ด์˜ ์ˆซ์ž๋ฅผ ๋ชจ๋‘ Set์— ์ถ”๊ฐ€ํ•˜์—ฌ ์ค‘๋ณต ์ œ๊ฑฐ
17+
const distinctSet = new Set([...nums]);
18+
19+
// 0๋ถ€ํ„ฐ n๊นŒ์ง€์˜ ์ˆซ์ž ์ค‘์—์„œ ๋ˆ„๋ฝ๋œ ์ˆซ์ž๋ฅผ ํƒ์ƒ‰
20+
for (let i = 0; i < nums.length; i++) {
21+
// Set์— i๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด i๊ฐ€ ๋ˆ„๋ฝ๋œ ์ˆซ์ž
22+
if (!distinctSet.has(i)) {
23+
return i;
24+
}
25+
}
26+
27+
// ๋ชจ๋“  ์ˆซ์ž๊ฐ€ Set์— ์กด์žฌํ•˜๋ฉด n์ด ๋ˆ„๋ฝ๋œ ์ˆซ์ž
28+
return nums.length;
29+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
/**
2+
* ๋ฌธ์ž์—ด์—์„œ substring ์ค‘ panlindrome์ธ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ•จ์ˆ˜
3+
* @param {string} s - ์ž…๋ ฅ ๋ฌธ์ž์—ด
4+
* @returns {number} - s๋ฌธ์ž์—ด์—์„œ ์ฐพ์„์ˆ˜ ์žˆ๋Š” panlindrome substring์˜ ๊ฐœ์ˆ˜
5+
*
6+
* ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n^2) (n: ๋ฌธ์ž์—ด ๊ธธ์ด)
7+
* - ํ•œ ๋ฒˆ์˜ ์™ธ๋ถ€ ๋ฃจํ”„: ๋ถ€๋ถ„ ๋ฌธ์ž์—ด ๊ธธ์ด (\(subLen\)) - O(n)
8+
* - ๋‚ด๋ถ€ ๋ฃจํ”„: ์‹œ์ž‘ ์ธ๋ฑ์Šค (\(start\)) - O(n)
9+
* - ๋”ฐ๋ผ์„œ, ์ด ๋ณต์žก๋„๋Š” O(n^2)
10+
*
11+
* ๊ณต๊ฐ„ ๋ณต์žก๋„: O(n^2)
12+
* - DP ๋ฐฐ์—ด dp[i][j]๋Š” \(n^2\) ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง€๋ฉฐ ๋ฌธ์ž์—ด์˜ ๋ชจ๋“  ์‹œ์ž‘๊ณผ ๋ ์กฐํ•ฉ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
13+
*/
14+
function countSubstrings(s: string): number {
15+
const n = s.length; // ๋ฌธ์ž์—ด ๊ธธ์ด
16+
let result = 0;
17+
18+
// DP ๋ฐฐ์—ด ์ƒ์„ฑ (dp[i][j] ๋Š” s[i] ~ s[j] ๊นŒ์ง€๊ฐ€ ํšŒ๋ฌธ์ธ์ง€ ์—ฌ๋ถ€๋ฅผ ์ €์žฅ)
19+
const dp: boolean[][] = Array.from({ length: n }, () => Array(n).fill(false));
20+
21+
// 1๊ธ€์ž ๊ฒฝ์šฐ
22+
for (let i = 0; i < n; i++) {
23+
dp[i][i] = true;
24+
result++;
25+
}
26+
27+
// 2๊ธ€์ž ๊ฒฝ์šฐ
28+
for (let i = 0; i < n - 1; i++) {
29+
if (s[i] === s[i + 1]) {
30+
dp[i][i + 1] = true;
31+
result++;
32+
}
33+
}
34+
35+
// 3๊ธ€์ž ์ด์ƒ์ธ ๊ฒฝ์šฐ
36+
for (let subLen = 3; subLen <= n; subLen++) {
37+
for (let start = 0; start <= n - subLen; start++) {
38+
const end = start + subLen - 1;
39+
// ์–‘ ๋ ๋ฌธ์ž๊ฐ€ ๊ฐ™๊ณ , ๋‚ด๋ถ€ ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์ด ํšŒ๋ฌธ์ด๋ฉด true
40+
if (s[start] === s[end] && dp[start + 1][end - 1]) {
41+
dp[start][end] = true;
42+
result++;
43+
}
44+
}
45+
}
46+
47+
return result;
48+
}

โ€Žword-search/Yjason-K.ts

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
/**
2+
* board ์—์„œ ์ฃผ์–ด์ง„ ๋‹จ์–ด๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€ ํ™•์ธ (boolean)
3+
* @param {string[][]} board - ๋‹จ์–ด๋ฅผ ํƒ์ƒ‰ํ•  2D board
4+
* @param {string} word - ์ฐพ๊ณ ์ž ํ•˜๋Š” ๋‹จ์–ด
5+
* @returns {boolean} - ๋‹จ์–ด๊ฐ€ ๊ฒฉ์ž์—์„œ ์กด์žฌํ•˜๋ฉด true, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด false
6+
*
7+
* ์‹œ๊ฐ„ ๋ณต์žก๋„: O(N * M * 4^L)
8+
* - N: board์˜ ํ–‰ ๊ฐœ์ˆ˜
9+
* - M: board์˜ ์—ด ๊ฐœ์ˆ˜
10+
* - L: word์˜ ๊ธธ์ด
11+
*
12+
* ๊ณต๊ฐ„ ๋ณต์žก๋„: O(L) (์žฌ๊ท€ ํ˜ธ์ถœ ์Šคํƒ)
13+
*/
14+
function exist(board: string[][], word: string): boolean {
15+
const rows = board.length;
16+
const cols = board[0].length;
17+
18+
// ๋ฐฉํ–ฅ ๋ฐฐ์—ด (์ƒ, ํ•˜, ์ขŒ, ์šฐ)
19+
const directions = [
20+
[0, -1], // ์ƒ
21+
[0, 1], // ํ•˜
22+
[-1, 0], // ์ขŒ
23+
[1, 0], // ์šฐ
24+
];
25+
26+
/**
27+
* DFS ํƒ์ƒ‰(๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰)์„ ํ†ตํ•ด ๋‹จ์–ด๋ฅผ ์ฐพ๋Š” ํ•จ์ˆ˜
28+
* @param {number} x - ํ˜„์žฌ x ์ขŒํ‘œ (์—ด)
29+
* @param {number} y - ํ˜„์žฌ y ์ขŒํ‘œ (ํ–‰)
30+
* @param {number} index - ํ˜„์žฌ ํƒ์ƒ‰ ์ค‘์ธ word์˜ ๋ฌธ์ž ์ธ๋ฑ์Šค
31+
* @returns {boolean} - ํ˜„์žฌ ๊ฒฝ๋กœ๊ฐ€ ์œ ํšจํ•˜๋ฉด true, ์œ ํšจํ•˜์ง€ ์•Š์œผ๋ฉด false
32+
*/
33+
const dfs = (x: number, y: number, index: number): boolean => {
34+
// ๋‹จ์–ด๋ฅผ ๋ชจ๋‘ ์ฐพ์•˜์„ ๊ฒฝ์šฐ
35+
if (index === word.length) return true;
36+
37+
// ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๊ฑฐ๋‚˜ ๋ฌธ์ž๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ
38+
if (x < 0 || y < 0 || x >= cols || y >= rows || board[y][x] !== word[index]) {
39+
return false;
40+
}
41+
42+
// ํ˜„์žฌ ์œ„์น˜ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ (์ž„์‹œ ์ˆ˜์ •)
43+
const temp = board[y][x];
44+
board[y][x] = "#";
45+
46+
// ์ƒํ•˜์ขŒ์šฐ ํƒ์ƒ‰
47+
for (const [dx, dy] of directions) {
48+
if (dfs(x + dx, y + dy, index + 1)) {
49+
return true;
50+
}
51+
}
52+
53+
// ๋ฐฑํŠธ๋ž˜ํ‚น: ์…€ ๊ฐ’ ๋ณต๊ตฌ
54+
board[y][x] = temp;
55+
56+
return false;
57+
};
58+
59+
// board์—์„œ word ์ฒซ๊ธ€์ž๊ฐ€ ์ผ์น˜ํ•˜๋Š” ๊ฒฝ์šฐ ํƒ์ƒ‰ ์‹œ์ž‘
60+
for (let y = 0; y < rows; y++) {
61+
for (let x = 0; x < cols; x++) {
62+
if (board[y][x] === word[0] && dfs(x, y, 0)) {
63+
return true;
64+
}
65+
}
66+
}
67+
68+
return false;
69+
}
70+

0 commit comments

Comments
ย (0)