Skip to content

Commit e5fe6dd

Browse files
authored
Merge pull request #1835 from jangwonyoon/main
2 parents 54b1dd0 + 1381ad8 commit e5fe6dd

File tree

4 files changed

+300
-0
lines changed

4 files changed

+300
-0
lines changed
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
/**
2+
* 153. Find Minimum in Rotated Sorted Array
3+
* https://leetcode.com/problems/find-minimum-in-rotated-sorted-array/
4+
*
5+
*/
6+
7+
/**
8+
* 풀이 1
9+
* 정렬 Sorting
10+
*
11+
* @param {number[]} nums
12+
* @return {number}
13+
*
14+
* 시간 복잡도(TC): O(n log n)
15+
* 공간 복잡도(SC): O(1)
16+
*
17+
* 관련 알고리즘: 정렬 Sorting
18+
*
19+
* 문제 풀이 방법:
20+
* 1. 배열을 정렬하고 첫 번째 요소를 반환
21+
*
22+
* 문제의 의도와 맞지 않는듯
23+
*/
24+
25+
var findMin = function(nums) {
26+
return nums.sort((a, b) => a - b)[0];
27+
};
28+
29+
/**
30+
* 풀이 2
31+
* 투 포인터 Two Pointers
32+
*
33+
* @param {number[]} nums
34+
* @return {number}
35+
*
36+
* 시간 복잡도(TC): O(n)
37+
* 공간 복잡도(SC): O(1)
38+
*
39+
* 관련 알고리즘: 투 포인터 Two Pointers
40+
*
41+
* 문제 풀이 방법:
42+
* 1. 배열을 순회하면서 최소값을 찾으면 된다.
43+
* 2. 최소값을 찾으면 반환
44+
*/
45+
46+
var findMin = function(nums) {
47+
let result = Infinity;
48+
49+
for (let i = 0; i < nums.length; i++) {
50+
const curr = nums[i];
51+
result = Math.min(result, curr);
52+
}
53+
54+
return result;
55+
};
56+
57+
/**
58+
* 풀이 3
59+
* 이진 탐색 Binary Search
60+
*
61+
* @param {number[]} nums
62+
* @return {number}
63+
*
64+
* 시간 복잡도(TC): O(log n)
65+
* 공간 복잡도(SC): O(1)
66+
*
67+
* 관련 알고리즘: 이진 탐색 Binary Search
68+
*
69+
* 문제 풀이 방법:
70+
* 1. 배열을 이진 탐색으로 탐색
71+
*/
72+
73+
var findMin = function(nums) {
74+
let left = 0;
75+
let right = nums.length - 1;
76+
77+
while (left < right) {
78+
const mid = Math.floor((left + right) / 2);
79+
80+
// mid가 right보다 크면 최소값은 오른쪽
81+
if (nums[mid] > nums[right]) {
82+
left = mid + 1;
83+
} else {
84+
// mid가 right보다 작다면
85+
right = mid;
86+
}
87+
}
88+
89+
return nums[left];
90+
};
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
/**
2+
* 104. Maximum Depth of Binary Tree
3+
* https://leetcode.com/problems/maximum-depth-of-binary-tree/
4+
*
5+
*/
6+
7+
/**
8+
* Definition for a binary tree node.
9+
* function TreeNode(val, left, right) {
10+
* this.val = (val===undefined ? 0 : val)
11+
* this.left = (left===undefined ? null : left)
12+
* this.right = (right===undefined ? null : right)
13+
* }
14+
*/
15+
/**
16+
* @param {TreeNode} root
17+
* @return {number}
18+
*/
19+
20+
/*
21+
* 시간 복잡도(TC): O(n)
22+
* 공간 복잡도(SC): O(n)
23+
*
24+
* 관련 알고리즘: 분할 정복 Divide and Conquer, 재귀 Recursion
25+
*
26+
* 문제 풀이 방법:
27+
* 1. 루트 노드가 없으면 0을 반환
28+
* 2. 루트 노드의 왼쪽 서브트리의 최대 깊이를 계산
29+
* 3. 루트 노드의 오른쪽 서브트리의 최대 깊이를 계산
30+
* 4. 루트 노드의 왼쪽 서브트리의 최대 깊이와 오른쪽 서브트리의 최대 깊이 중 더 큰 값을 반환
31+
* 5. 루트 노드의 왼쪽 서브트리의 최대 깊이와 오른쪽 서브트리의 최대 깊이 중 더 큰 값에 1을 더하여 반환
32+
*/
33+
34+
var maxDepth = function(root) {
35+
// 루트 노드가 없으면 0을 반환
36+
if (!root) return 0;
37+
38+
// 루트 노드의 왼쪽 서브트리의 최대 깊이를 계산
39+
let left = maxDepth(root.left);
40+
// 루트 노드의 오른쪽 서브트리의 최대 깊이를 계산
41+
let right = maxDepth(root.right);
42+
43+
// 루트 노드의 왼쪽 서브트리의 최대 깊이와 오른쪽 서브트리의 최대 깊이 중 더 큰 값을 반환
44+
// 루트 노드의 왼쪽 서브트리의 최대 깊이와 오른쪽 서브트리의 최대 깊이 중 더 큰 값에 1을 더하여 반환
45+
return Math.max(left, right) + 1;
46+
};

merge-two-sorted-lists/jangwonyoon.js

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/**
2+
* Definition for singly-linked list.
3+
* function ListNode(val, next) {
4+
* this.val = (val===undefined ? 0 : val)
5+
* this.next = (next===undefined ? null : next)
6+
* }
7+
*/
8+
/**
9+
* @param {ListNode} list1
10+
* @param {ListNode} list2
11+
* @return {ListNode}
12+
*/
13+
14+
/*
15+
* 시간 복잡도(TC): O(n + m)
16+
- n: list1의 길이, m: list2의 길이
17+
18+
* 공간 복잡도(SC): O(n + m)
19+
- 재귀 호출 시 스택 메모리가 최대 n+m 깊이까지 쌓일 수 있음
20+
*/
21+
22+
var mergeTwoLists = function(list1, list2) {
23+
// 예외처리 - 둘 중 하나라도 리스트가 비어있으면, 그냥 다른 리스트를 반환.
24+
if (!list1) return list2;
25+
if (!list2) return list1;
26+
27+
// 현재 노드 값 비교
28+
if (list1.val <= list2.val) {
29+
// list1의 값이 더 작거나 같으면
30+
// list1의 결과 리스트의 head로 선택
31+
// list1.next는 남은 list1.next와 list2를 병합한 결과로 연결
32+
list1.next = mergeTwoLists(list1.next, list2);
33+
return list1;
34+
} else {
35+
// list2의 값이 더 작으면
36+
// list2의 결과를 리스트의 head로 선택
37+
// list2.next는 list1과 list2.next를 병합한 결과로 연결
38+
list2.next = mergeTwoLists(list1, list2.next);
39+
return list2;
40+
}
41+
};

word-search/jangwonyoon.js

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
/**
2+
* 79. Word Search
3+
* https://leetcode.com/problems/word-search/
4+
*
5+
*/
6+
7+
/*
8+
* 시간 복잡도(TC): O(m * n * 4^L)
9+
* m = 행, n = 열, L = 단어 길이
10+
*
11+
* 공간 복잡도(SC): O(L)
12+
* L = 단어 길이
13+
*
14+
* 관련 알고리즘: 깊이 우선 탐색 Depth-First Search (DFS)
15+
*
16+
* 문제 풀이 방법:
17+
* 1. 깊이 우선 탐색 (DFS)을 사용하여 시작점부터 첫 글자가 맞는 칸에서만 탐색
18+
* 2. 탐색 결과를 반환
19+
*/
20+
/**
21+
* @param {character[][]} board
22+
* @param {string} word
23+
* @return {boolean}
24+
*/
25+
var exist = function(board, word) {
26+
const rows = board.length;
27+
const cols = board[0].length;
28+
29+
function dfs(r, c, idx) {
30+
// 1) 기저: 단어를 모두 매칭했을 경우 - 탈출 조건
31+
if (idx === word.length) return true;
32+
33+
// 2) 가드: 범위/문자/방문 상태 확인
34+
if (r < 0 || r >= rows || c < 0 || c >= cols) return false;
35+
if (board[r][c] !== word[idx]) return false;
36+
if (board[r][c] === '#') return false; // 이미 방문했으면 탈락
37+
38+
// 3) 방문 마킹
39+
const tmp = board[r][c];
40+
board[r][c] = '#';
41+
42+
// 4방향 탐색 (상, 하, 좌, 우)
43+
const ok =
44+
dfs(r + 1, c, idx + 1) ||
45+
dfs(r - 1, c, idx + 1) ||
46+
dfs(r, c + 1, idx + 1) ||
47+
dfs(r, c - 1, idx + 1);
48+
49+
// 5) 복구
50+
board[r][c] = tmp;
51+
52+
return ok;
53+
}
54+
55+
// 시작점: 첫 글자와 일치하는 칸에서만 DFS 시작
56+
for (let row = 0; row < rows; row++) {
57+
for (let col = 0; col < cols; col++) {
58+
// 첫 글자가 맞으면서 dfs가 성공했을 경우 true 반환
59+
if (board[row][col] === word[0] && dfs(row, col, 0)) return true;
60+
}
61+
}
62+
63+
return false;
64+
};
65+
66+
/**
67+
* 풀이 2
68+
* 방문 배열 사용
69+
*
70+
* 시간 복잡도(TC): O(m * n * 4^L)
71+
* 공간 복잡도(SC): O(m * n)
72+
*
73+
* 관련 알고리즘: 깊이 우선 탐색 Depth-First Search (DFS)
74+
*
75+
* 문제 풀이 방법:
76+
* 1. 방문 배열을 사용하여 방문한 칸을 체크
77+
78+
* @param {character[][]} board
79+
* @param {string} word
80+
* @return {boolean}
81+
*/
82+
83+
var exist = function(board, word) {
84+
const rows = board.length;
85+
const cols = board[0].length;
86+
87+
// visited 배열 초기화
88+
const visited = Array.from({ length: rows }, () => Array(cols).fill(false));
89+
90+
function dfs(r, c, idx) {
91+
// 1) 기저 조건: 단어를 모두 찾은 경우
92+
if (idx === word.length) return true;
93+
94+
// 2) 가드 조건
95+
if (r < 0 || r >= rows || c < 0 || c >= cols) return false;
96+
if (visited[r][c]) return false;
97+
if (board[r][c] !== word[idx]) return false;
98+
99+
// 3) 방문 처리
100+
visited[r][c] = true;
101+
102+
// 4) 네 방향 탐색
103+
const ok =
104+
dfs(r + 1, c, idx + 1) ||
105+
dfs(r - 1, c, idx + 1) ||
106+
dfs(r, c + 1, idx + 1) ||
107+
dfs(r, c - 1, idx + 1);
108+
109+
// 5) 복구 (다른 경로에서 다시 쓸 수 있게)
110+
visited[r][c] = false;
111+
112+
return ok;
113+
}
114+
115+
// 6) 시작점 순회
116+
for (let r = 0; r < rows; r++) {
117+
for (let c = 0; c < cols; c++) {
118+
if (board[r][c] === word[0] && dfs(r, c, 0)) return true;
119+
}
120+
}
121+
122+
return false;
123+
};

0 commit comments

Comments
 (0)