Skip to content

Commit 88214b4

Browse files
committed
1 parent 356e622 commit 88214b4

File tree

4 files changed

+176
-0
lines changed

4 files changed

+176
-0
lines changed
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
/**
2+
* λ°°μ—΄μ—μ„œ κ°€μž₯ μž‘μ€ 수 μ°ΎκΈ° ( μ œμ•½ : μ‹œκ°„ λ³΅μž‘λ„ O(log n) )
3+
* @param {number[]} nums νšŒμ „λœ 수 λ°°μ—΄
4+
*
5+
* μ‹œκ°„ 볡작되: O(log n)
6+
* - 이뢄 탐색을 μ‚¬μš©ν•˜μ—¬ μ΅œμ†Œκ°’μ„ 탐색
7+
*
8+
* 곡간 λ³΅μž‘λ„: O(1)
9+
*/
10+
function findMin(nums: number[]): number {
11+
let left = 0, right = nums.length - 1;
12+
13+
while (left <= right) {
14+
let mid = Math.floor((left + right) / 2);
15+
16+
// 정렬이 망가진 경우
17+
if (nums[mid] < nums[mid-1]) return nums[mid];
18+
19+
// left, right λ²”μœ„ μ€„μ—¬λ‚˜κ°€κΈ°
20+
if (nums[0] < nums[mid]){
21+
left = mid + 1;
22+
} else {
23+
right = mid - 1;
24+
}
25+
}
26+
27+
// 탐색 후에도 μ°Ύμ§€ λͺ»ν•œ 경우 νšŒμ „λ˜μ§€ μ•Šμ€ 경우
28+
return nums[0];
29+
30+
}
31+

β€Žlinked-list-cycle/Yjason-K.ts

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
/**
2+
* Definition for singly-linked list.
3+
* class ListNode {
4+
* val: number
5+
* next: ListNode | null
6+
* constructor(val?: number, next?: ListNode | null) {
7+
* this.val = (val===undefined ? 0 : val)
8+
* this.next = (next===undefined ? null : next)
9+
* }
10+
* }
11+
*/
12+
13+
/**
14+
* μ—°κ²° λ¦¬μŠ€νŠΈμΈκ°€ μˆœν™˜ν•˜λŠ”μ§€ μ—¬λΆ€ 확인
15+
* @param {ListNode} head - ListNode
16+
* @returns {boolean} - μˆœν™˜ μ—¬λΆ€
17+
*
18+
* μ‹œκ°„ λ³΅μž‘λ„: O(n)
19+
*
20+
* 곡간 λ³΅μž‘λ„: O(n)
21+
* - λ…Έλ“œμ˜ 개수만큼 Set에 μ €μž₯
22+
*/
23+
function hasCycle(head: ListNode | null): boolean {
24+
const set = new Set();
25+
26+
while (head) {
27+
if (set.has(head)) {
28+
return true;
29+
}
30+
31+
set.add(head);
32+
head = head.next;
33+
}
34+
35+
return false;
36+
}
37+
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
/**
2+
* subArray 쀑 μ΅œλŒ€ 곱을 κ΅¬ν•˜λŠ” ν•¨μˆ˜
3+
* @param {number[]} nums - 숫자 λ°°μ—΄
4+
* @returns {number} - subArray 쀑 μ΅œλŒ€ κ³±
5+
*
6+
* @description 음수의 곱이 쑴재 ν•  수 있기 λ•Œλ¬Έμ—, μ΅œλŒ€ κ°’κ³Ό μ΅œμ†Œκ°’μ„ κ°±μ‹ ν•˜λ©°, κ²°κ³Ό 값을 κ°±μ‹ .
7+
*
8+
* μ‹œκ°„ λ³΅μž‘λ„ : O(n)
9+
* - nums λ°°μ—΄ 1회 순회
10+
*
11+
* 곡간 λ³΅μž‘λ„ : O(1)
12+
*/
13+
function maxProduct(nums: number[]): number {
14+
let max = nums[0];
15+
let min = nums[0];
16+
let result = nums[0];
17+
18+
// 첫 번째 μš”μ†Œλ₯Ό μ œμ™Έν•œ λͺ¨λ“  μš”μ†Œλ₯Ό 탐색
19+
for (let i = 1; i < nums.length; i++) {
20+
let current = nums[i]
21+
22+
// ν˜„μž¬ κ°’, 이전 μ΅œλŒ€ 곱과의 κ³±, 이전 μ΅œμ†Œ 곱과의 κ³± 쀑 μ΅œλŒ€/μ΅œμ†Œ κ°±μ‹ 
23+
const cases = [current * max, current * min, current];
24+
25+
max = Math.max(...cases);
26+
min = Math.min(...cases);
27+
result = Math.max(result, max);
28+
}
29+
30+
return result;
31+
}
32+
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
/**
2+
* 깊이 μš°μ„  탐색(DFS)을 μ‚¬μš©ν•˜μ—¬ νŠΉμ • λ°”λ‹€μ—μ„œ 올라갈 수 μžˆλŠ” μ’Œν‘œμ„ μ €μž₯
3+
* @param i ν˜„μž¬ μœ„μΉ˜μ˜ ν–‰ (row)
4+
* @param j ν˜„μž¬ μœ„μΉ˜μ˜ μ—΄ (column)
5+
* @param visited λ°©λ¬Έν•œ μ’Œν‘œλ₯Ό μ €μž₯ν•˜λŠ” Set (λ°”λ‹€μ—μ„œ 도달할 수 μžˆλŠ” μœ„μΉ˜λ₯Ό μ €μž₯)
6+
* @param heights 높이 정보가 λ‹΄κΈ΄ 2차원 λ°°μ—΄
7+
*
8+
* μ‹œκ°„ λ³΅μž‘λ„: O(m Γ— n)
9+
* - 각 셀은 μ΅œλŒ€ ν•œ 번 λ°©λ¬Έν•˜λ©°, 총 m Γ— n개의 셀을 탐색함
10+
*
11+
* 곡간 λ³΅μž‘λ„: O(m Γ— n)
12+
* - `visited` Set에 μ΅œλŒ€ m Γ— n개의 μ’Œν‘œλ₯Ό μ €μž₯ κ°€λŠ₯
13+
* - μž¬κ·€ 호좜 μŠ€νƒμ˜ κΉŠμ΄λŠ” O(m + n) (μ΅œμ•…μ˜ 경우 κ°€μž₯ κΈ΄ 경둜λ₯Ό 따라 탐색)
14+
*/
15+
function dfs(i: number, j: number, visited: Set<string>, heights: number[][]) {
16+
if (visited.has(`${i},${j}`)) return;
17+
18+
visited.add(`${i},${j}`);
19+
20+
for (const [di, dj] of [[-1, 0], [1, 0], [0, -1], [0, 1]]) {
21+
const newI = i + di;
22+
const newJ = j + dj;
23+
24+
if (
25+
newI >= 0 && newI < heights.length &&
26+
newJ >= 0 && newJ < heights[0].length &&
27+
heights[newI][newJ] >= heights[i][j]
28+
) {
29+
dfs(newI, newJ, visited, heights);
30+
}
31+
}
32+
};
33+
34+
/**
35+
* 두 λ°”λ‹€ λͺ¨λ‘ 도달할 수 μžˆλŠ” μ’Œν‘œλ₯Ό μ°ΎλŠ” ν•¨μˆ˜
36+
*
37+
* @param heights 2차원 λ°°μ—΄λ‘œ 이루어진 μ§€ν˜•μ˜ 높이 정보
38+
* @returns 두 λ°”λ‹€ λͺ¨λ‘ 도달할 수 μžˆλŠ” μ’Œν‘œ λ°°μ—΄
39+
*
40+
* μ‹œκ°„ λ³΅μž‘λ„: O(m Γ— n)
41+
* - νƒœν‰μ–‘ 및 λŒ€μ„œμ–‘μ—μ„œ 각각 DFS μˆ˜ν–‰ β†’ O(m Γ— n)
42+
* - κ²°κ³Όλ₯Ό μ°ΎλŠ” 이쀑 루프 β†’ O(m Γ— n)
43+
*
44+
* 곡간 λ³΅μž‘λ„: O(m Γ— n)
45+
* - `pacificSet`κ³Ό `atlanticSet`에 μ΅œλŒ€ O(m Γ— n)개의 μ’Œν‘œ μ €μž₯
46+
*
47+
*/
48+
function pacificAtlantic(heights: number[][]): number[][] {
49+
if (!heights || heights.length === 0 || heights[0].length === 0) return [];
50+
51+
const rows = heights.length;
52+
const cols = heights[0].length;
53+
54+
const pacificSet = new Set<string>();
55+
const atlanticSet = new Set<string>();
56+
57+
// νƒœν‰μ–‘(μ™Όμͺ½, μœ„μͺ½)μ—μ„œ μΆœλ°œν•˜λŠ” DFS
58+
for (let i = 0; i < rows; i++) dfs(i, 0, pacificSet, heights);
59+
for (let j = 0; j < cols; j++) dfs(0, j, pacificSet, heights);
60+
61+
// λŒ€μ„œμ–‘(였λ₯Έμͺ½, μ•„λž˜μͺ½)μ—μ„œ μΆœλ°œν•˜λŠ” DFS
62+
for (let i = 0; i < rows; i++) dfs(i, cols - 1, atlanticSet, heights);
63+
for (let j = 0; j < cols; j++) dfs(rows - 1, j, atlanticSet, heights);
64+
65+
const result: number[][] = [];
66+
for (let i = 0; i < rows; i++) {
67+
for (let j = 0; j < cols; j++) {
68+
if (pacificSet.has(`${i},${j}`) && atlanticSet.has(`${i},${j}`)) {
69+
result.push([i, j]);
70+
}
71+
}
72+
}
73+
74+
return result;
75+
};
76+

0 commit comments

Comments
Β (0)