Skip to content

Commit bf00cab

Browse files
authored
Merge pull request #1026 from Yjason-K/main
[gomgom22] Week10
2 parents 2d64456 + 8d4834c commit bf00cab

File tree

8 files changed

+348
-0
lines changed

8 files changed

+348
-0
lines changed

โ€Žcourse-schedule/Yjason-K.ts

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
2+
/**
3+
* ์„ ์ˆ˜ ๊ณผ๋ชฉ๊ณผ ์ด์ˆ˜ ๊ณผ๋ชฉ ๊ด€๊ณ„๋ฅผ ํ™•์ธํ•˜์—ฌ ๋ชจ๋“  ๊ณผ๋ชฉ์„ ์ด์ˆ˜ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€ ํ™•์ธ.
4+
* @param {number} numCourses - ์ „์ฒด ๊ณผ๋ชฉ ์ˆ˜
5+
* @param {number[][]} prerequisites - ์„ ์ˆ˜ ๊ณผ๋ชฉ๊ณผ ์ด์ˆ˜ ๊ณผ๋ชฉ ๊ด€๊ณ„ ์ •๋ณด
6+
* @returns {boolean} - ๋ชจ๋“  ๊ณผ๋ชฉ์„ ์ˆ˜๊ฐ•ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€
7+
*
8+
* ์‹œ๊ฐ„ ๋ณต์žก๋„: O(V + E)
9+
* - ๊ทธ๋ž˜ํ”„๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ณผ์ •์—์„œ O(E),
10+
* - bfs O(V + E),
11+
*
12+
* ๊ณต๊ฐ„ ๋ณต์žก๋„: O(V + E)
13+
* - ๊ฐ ๊ณผ๋ชฉ์— ๋Œ€ํ•œ ์„ ์ˆ˜ ๊ณผ๋ชฉ ์ €์žฅ์— O(V + E),
14+
* - prereqCount ์ €์žฅ์— O(V),
15+
* - ํ(queue) ์ €์žฅ์— O(V),
16+
*/
17+
function canFinish(numCourses: number, prerequisites: number[][]): boolean {
18+
// ๊ฐ ๊ณผ๋ชฉ์˜ ์„ ์ˆ˜ ๊ณผ๋ชฉ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฆฌ์ŠคํŠธ
19+
const graph: number[][] = Array.from({ length: numCourses }, () => []);
20+
// ๊ฐ ๊ณผ๋ชฉ์˜ ์„ ์ˆ˜ ๊ณผ๋ชฉ ์ˆ˜ ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฐ์—ด
21+
const prereqCount: number[] = new Array(numCourses).fill(0);
22+
23+
// ๊ทธ๋ž˜ํ”„ ๋ฐ ์„ ์ˆ˜ ๊ณผ๋ชฉ ๊ฐœ์ˆ˜ ์ดˆ๊ธฐํ™”
24+
for (const [course, prereq] of prerequisites) {
25+
graph[prereq].push(course); // ์„ ์ˆ˜ ๊ณผ๋ชฉ์„ ๋“ค์–ด์•ผ ์ˆ˜๊ฐ• ๊ฐ€๋Šฅํ•œ ๊ณผ๋ชฉ ์ถ”๊ฐ€
26+
prereqCount[course]++; // ํ•ด๋‹น ๊ณผ๋ชฉ์˜ ์„ ์ˆ˜ ๊ณผ๋ชฉ ๊ฐœ์ˆ˜ ์ฆ๊ฐ€
27+
}
28+
29+
// ์„ ์ˆ˜ ๊ณผ๋ชฉ์ด ์—†๋Š” ๊ณผ๋ชฉ๋“ค์„ ์ €์žฅํ•  ํ
30+
const queue: number[] = [];
31+
32+
// ์„ ์ˆ˜ ๊ณผ๋ชฉ์ด ์—†๋Š” ๊ณผ๋ชฉ๋“ค์„ ํ์— ์ถ”๊ฐ€ (์ง„์ž… ์ฐจ์ˆ˜๊ฐ€ 0์ธ ๋…ธ๋“œ)
33+
for (let i = 0; i < numCourses; i++) {
34+
if (prereqCount[i] === 0) {
35+
queue.push(i);
36+
}
37+
}
38+
39+
// ์ˆ˜๊ฐ•ํ•œ ๊ณผ๋ชฉ ์ˆ˜
40+
let completedCourses = 0;
41+
42+
// ์„ ์ˆ˜ ๊ณผ๋ชฉ์ด ์—†๋Š” ๊ณผ๋ชฉ์„ ์‚ฌ์šฉํ•ด์„œ ๋‹ค์Œ ๊ณผ๋ชฉ์„ ์ˆ˜๊ฐ•
43+
while (queue.length > 0) {
44+
const current = queue.shift()!;
45+
completedCourses++; // ๊ณผ๋ชฉ ์ˆ˜๊ฐ• ์™„๋ฃŒ
46+
47+
// ํ˜„์žฌ ๊ณผ๋ชฉ์„ ์„ ์ˆ˜ ๊ณผ๋ชฉ์œผ๋กœ ํ•˜๋Š” ๋‹ค๋ฅธ ๊ณผ๋ชฉ๋“ค์˜ ์„ ์ˆ˜ ๊ณผ๋ชฉ ๊ฐœ์ˆ˜ ๊ฐ์†Œ
48+
for (const nextCourse of graph[current]) {
49+
prereqCount[nextCourse]--;
50+
51+
// ์„ ์ˆ˜ ๊ณผ๋ชฉ ๊ฐœ์ˆ˜๊ฐ€ 0์ด ๋˜๋ฉด ํ์— ์ถ”๊ฐ€ (๋” ์ด์ƒ ๊ธฐ๋‹ค๋ฆด ํ•„์š” ์—†์Œ)
52+
if (prereqCount[nextCourse] === 0) {
53+
queue.push(nextCourse);
54+
}
55+
}
56+
}
57+
58+
// ๋ชจ๋“  ๊ณผ๋ชฉ์„ ์ˆ˜๊ฐ• ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธ
59+
return completedCourses === numCourses;
60+
}
61+
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+

โ€Žinvert-binary-tree/Yjason-K.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/**
2+
* ์ด์ง„ ํŠธ๋ฆฌ๋ฅผ ๋ฐ˜์ „์‹œํ‚ค๋Š” ํ•จ์ˆ˜
3+
* @param {TreeNode | null} root - ๋ฐ˜์ „ํ•  ์ด์ง„ ํŠธ๋ฆฌ์˜ ๋ฃจํŠธ ๋…ธ๋“œ
4+
* @returns {TreeNode | null} - ๋ฐ˜์ „๋œ ์ด์ง„ ํŠธ๋ฆฌ์˜ ๋ฃจํŠธ ๋…ธ๋“œ
5+
*
6+
* ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n)
7+
* - ํŠธ๋ฆฌ์˜ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ํ•œ ๋ฒˆ์”ฉ ๋ฐฉ๋ฌธํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์„ ํ˜• ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง
8+
* ๊ณต๊ฐ„ ๋ณต์žก๋„: O(h)
9+
* - ์žฌ๊ท€ ํ˜ธ์ถœ์— ์˜ํ•ด ์ตœ๋Œ€ ํŠธ๋ฆฌ์˜ ๋†’์ด(h)๋งŒํผ์˜ ํ˜ธ์ถœ ์Šคํƒ์ด ํ•„์š”
10+
*/
11+
function invertTree(root: TreeNode | null): TreeNode | null {
12+
// ๋ฃจํŠธ๊ฐ€ null์ด๋ฉด null ๋ฐ˜ํ™˜
13+
if (!root) return null;
14+
15+
// ์™ผ์ชฝ๊ณผ ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ๋ฐ˜์ „
16+
const left = invertTree(root.left);
17+
const right = invertTree(root.right);
18+
19+
// ํ˜„์žฌ ๋…ธ๋“œ์˜ ์™ผ์ชฝ๊ณผ ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ๋ฅผ ๊ตํ™˜
20+
root.left = right;
21+
root.right = left;
22+
23+
// ๋ฐ˜์ „๋œ ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ๋ฐ˜ํ™˜
24+
return root;
25+
}
26+

โ€Žjump-game/Yjason-K.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/**
2+
* ๋ฐฐ์—ด์˜ ๊ฐ ์ธ๋ฑ์Šค์—์„œ ๊ฐ€๋Šฅํ•œ ์ ํ”„๋ฅผ ํ†ตํ•ด ๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค์— ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ฌธ์ œ
3+
* @param {number[]} nums - ๊ฐ ์ธ๋ฑ์Šค์—์„œ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ๊ฑฐ๋ฆฌ
4+
* @returns {boolean} - ๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค์— ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉด true, ์•„๋‹ˆ๋ฉด false
5+
*
6+
* ์‹œ๊ฐ„ ๋ณต์žก๋„: O(2^n)
7+
* - DFS ๊ธฐ๋ฐ˜์˜ ํƒ์ƒ‰์ด๋ฏ€๋กœ ์ตœ์•…์˜ ๊ฒฝ์šฐ ๋ชจ๋“  ๊ฒฝ์šฐ ํƒ์ƒ‰
8+
*
9+
* ๊ณต๊ฐ„ ๋ณต์žก๋„: O(n) (์žฌ๊ท€ ํ˜ธ์ถœ ์Šคํƒ๊ณผ ๋ฐฉ๋ฌธ ๋ฐฐ์—ด ์‚ฌ์šฉ)
10+
* - `visited` ๋ฐฐ์—ด์ด nums.length ํฌ๊ธฐ๋ฅผ ์ฐจ์ง€
11+
*/
12+
function canJump(nums: number[]): boolean {
13+
const visited = new Array(nums.length).fill(false);
14+
15+
const dfs = (idx: number): boolean => {
16+
if (idx >= nums.length - 1) return true; // ๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค ์ด์ƒ ๋„๋‹ฌํ•˜๋ฉด ์„ฑ๊ณต
17+
if (visited[idx]) return false; // ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ๊ฒฝ์šฐ ์ค‘๋ณต ๋ฐฉ๋ฌธ ๋ฐฉ์ง€
18+
19+
visited[idx] = true; // ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
20+
21+
for (let i = 1; i <= nums[idx]; i++) { // ํ˜„์žฌ ์œ„์น˜์—์„œ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์ ํ”„ ํƒ์ƒ‰
22+
if (dfs(idx + i)) return true;
23+
}
24+
25+
return false;
26+
}
27+
28+
return dfs(0); // 0๋ฒˆ ์ธ๋ฑ์Šค์—์„œ ์‹œ์ž‘
29+
}
30+

โ€Ž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+
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
// similar problem to #245 Find Minimum In Rotated Sorted Array
2+
/**
3+
* ํšŒ์ •๋œ ๋ฐฐ์—ด์—์„œ target์˜ index๋ฅผ ์ฐพ๋Š” ๋ฌธ์ œ
4+
* @param {number[]} nums - ํšŒ์ „๋œ ๋ฐฐ์—ด
5+
* @param target - ์ฐพ๋Š” ์ˆ˜
6+
* @returns {number} - target์˜ index
7+
*
8+
* ์‹œ๊ฐ„ ๋ณต์žก๋„: O(log n)
9+
* - ์ด๋ถ„ ํƒ์ƒ‰์„ ์‚ฌ์šฉํ•˜์—ฌ ์ตœ์ ์˜ ํƒ์ƒ‰์„ ์ˆ˜ํ–‰
10+
*
11+
* ๊ณต๊ฐ„ ๋ณต์žก๋„: O(1)
12+
* - ์ถ”๊ฐ€์ ์ธ ๊ณต๊ฐ„ ์‚ฌ์šฉ ์—†์ด ํฌ์ธํ„ฐ๋งŒ ์ด์šฉํ•˜์—ฌ ํƒ์ƒ‰
13+
*/
14+
function search(nums: number[], target: number): number {
15+
let left = 0, right = nums.length - 1;
16+
17+
while (left <= right) {
18+
let mid = Math.floor((left + right) / 2);
19+
20+
if (nums[mid] === target) return mid;
21+
22+
// mid๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์™ผ์ชฝ ๋ถ€๋ถ„์ด ์ •๋ ฌ๋œ ๊ฒฝ์šฐ
23+
if (nums[left] <= nums[mid]) {
24+
/**
25+
* ์™ผ์ชฝ ๋ถ€๋ถ„์ด ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ๋˜์–ด ์žˆ๋‹ค๋ฉด:
26+
* - nums[left] ~ nums[mid] ๋ฒ”์œ„๋Š” ์ •๋ ฌ๋˜์–ด ์žˆ์Œ
27+
* - target์ด ์ด ๋ฒ”์œ„ ๋‚ด์— ์žˆ๋‹ค๋ฉด, right๋ฅผ ์ค„์—ฌ์„œ ํƒ์ƒ‰
28+
* - ์•„๋‹ˆ๋ผ๋ฉด target์€ ์˜ค๋ฅธ์ชฝ์— ์žˆ์œผ๋ฏ€๋กœ left๋ฅผ ์ฆ๊ฐ€์‹œ์ผœ ํƒ์ƒ‰
29+
*/
30+
if (nums[left] <= target && target < nums[mid]) {
31+
right = mid - 1; // ์™ผ์ชฝ ๋ฒ”์œ„์—์„œ ํƒ์ƒ‰
32+
} else {
33+
left = mid + 1; // ์˜ค๋ฅธ์ชฝ ๋ฒ”์œ„์—์„œ ํƒ์ƒ‰
34+
}
35+
}
36+
// mid๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„์ด ์ •๋ ฌ๋œ ๊ฒฝ์šฐ
37+
else {
38+
/**
39+
* ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„์ด ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ๋˜์–ด ์žˆ๋‹ค๋ฉด:
40+
* - nums[mid] ~ nums[right] ๋ฒ”์œ„๋Š” ์ •๋ ฌ๋˜์–ด ์žˆ์Œ
41+
* - target์ด ์ด ๋ฒ”์œ„ ๋‚ด์— ์žˆ๋‹ค๋ฉด, left๋ฅผ ๋Š˜๋ ค์„œ ํƒ์ƒ‰
42+
* - ์•„๋‹ˆ๋ผ๋ฉด target์€ ์™ผ์ชฝ์— ์žˆ์œผ๋ฏ€๋กœ right๋ฅผ ๊ฐ์†Œ์‹œ์ผœ ํƒ์ƒ‰
43+
*/
44+
if (nums[mid] < target && target <= nums[right]) {
45+
left = mid + 1; // ์˜ค๋ฅธ์ชฝ ๋ฒ”์œ„์—์„œ ํƒ์ƒ‰
46+
} else {
47+
right = mid - 1; // ์™ผ์ชฝ ๋ฒ”์œ„์—์„œ ํƒ์ƒ‰
48+
}
49+
}
50+
}
51+
52+
// target์„ ์ฐพ์ง€ ๋ชปํ•œ ๊ฒฝ์šฐ
53+
return -1;
54+
}
55+

0 commit comments

Comments
ย (0)