Skip to content

Commit 80d8847

Browse files
authored
Merge pull request #1348 from byol-han/main
[byol-han] WEEK 04 solutions
2 parents 5383dff + 25b4c78 commit 80d8847

File tree

5 files changed

+167
-0
lines changed

5 files changed

+167
-0
lines changed

coin-change/byol-han.js

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/**
2+
* @param {number[]} coins
3+
* @param {number} amount
4+
* @return {number}
5+
*/
6+
var coinChange = function (coins, amount) {
7+
// dp[i]는 금액 i를 만들기 위한 최소 코인 수
8+
const dp = new Array(amount + 1).fill(Infinity);
9+
10+
// 금액 0을 만들기 위해 필요한 코인 수는 0개
11+
dp[0] = 0;
12+
13+
// 1부터 amount까지 반복
14+
for (let i = 1; i <= amount; i++) {
15+
// 각 금액마다 모든 코인 시도
16+
for (let coin of coins) {
17+
if (i - coin >= 0) {
18+
// 코인을 하나 사용했을 때, 남은 금액의 최소 개수 + 1
19+
dp[i] = Math.min(dp[i], dp[i - coin] + 1);
20+
}
21+
}
22+
}
23+
24+
// 만약 Infinity면 만들 수 없는 금액임
25+
return dp[amount] === Infinity ? -1 : dp[amount];
26+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/**
2+
* @param {number[]} nums
3+
* @return {number}
4+
*/
5+
var findMin = function (nums) {
6+
let left = 0;
7+
let right = nums.length - 1;
8+
9+
while (left < right) {
10+
let mid = Math.floor((left + right) / 2);
11+
12+
if (nums[mid] > nums[right]) {
13+
// 최소값은 mid 오른쪽
14+
left = mid + 1;
15+
} else {
16+
// 최소값은 mid 포함 왼쪽
17+
right = mid;
18+
}
19+
}
20+
21+
return nums[left];
22+
};
+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
/**
2+
* Definition for a binary tree node.
3+
* function TreeNode(val, left, right) {
4+
* this.val = (val===undefined ? 0 : val)
5+
* this.left = (left===undefined ? null : left)
6+
* this.right = (right===undefined ? null : right)
7+
* }
8+
*/
9+
/**
10+
* @param {TreeNode} root
11+
* @return {number}
12+
*/
13+
var maxDepth = function (root) {
14+
// 트리가 비어있는 경우, 깊이는 0
15+
if (!root) return 0;
16+
17+
// 왼쪽 서브트리의 최대 깊이를 재귀적으로 계산
18+
const leftDepth = maxDepth(root.left);
19+
20+
// 오른쪽 서브트리의 최대 깊이를 재귀적으로 계산
21+
const rightDepth = maxDepth(root.right);
22+
23+
// 왼쪽과 오른쪽 중 더 깊은 쪽을 선택하고, 현재 노드를 포함해 +1
24+
return Math.max(leftDepth, rightDepth) + 1;
25+
};

merge-two-sorted-lists/byol-han.js

+42
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
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+
var mergeTwoLists = function (list1, list2) {
14+
// 가짜(head 역할을 할) 임시 노드 생성
15+
// 실제 결과 리스트는 dummy.next부터 시작됨
16+
let dummy = new ListNode(-1);
17+
18+
// 현재 노드를 가리킬 포인터. 처음엔 dummy에서 시작
19+
let current = dummy;
20+
21+
// 두 리스트 모두 null이 아닐 동안 반복 (비교 가능한 노드가 있을 때까지)
22+
while (list1 !== null && list2 !== null) {
23+
// list1의 현재 값이 더 작으면 list1 노드를 current.next에 붙임
24+
if (list1.val < list2.val) {
25+
current.next = list1; // current 뒤에 list1 노드 연결
26+
list1 = list1.next; // list1 포인터를 다음 노드로 이동
27+
} else {
28+
current.next = list2; // current 뒤에 list2 노드 연결
29+
list2 = list2.next; // list2 포인터를 다음 노드로 이동
30+
}
31+
current = current.next; // current 포인터도 다음 노드로 이동 (리스트를 계속 이어가기 위해)
32+
}
33+
34+
// 위 반복문을 빠져나오면, 둘 중 하나는 null이 됨
35+
// 나머지 하나는 아직 정렬된 상태이므로 그대로 뒤에 붙여줌
36+
current.next = list1 !== null ? list1 : list2;
37+
38+
// dummy는 첫 번째 노드를 가리키는 용도였으니, 실제 결과 리스트는 dummy.next부터 시작
39+
return dummy.next;
40+
};
41+
// 시간 복잡도: O(n + m) (n: list1의 길이, m: list2의 길이)
42+
// 공간 복잡도: O(1) (추가적인 공간 사용 없음)

word-search/byol-han.js

+52
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
/**
2+
* @param {character[][]} board
3+
* @param {string} word
4+
* @return {boolean}
5+
*/
6+
var exist = function (board, word) {
7+
const rows = board.length;
8+
const cols = board[0].length;
9+
10+
function backtrack(row, col, index) {
11+
// 종료 조건: 모든 글자를 찾았으면 true
12+
if (index === word.length) return true;
13+
14+
// 범위 밖이거나, 현재 칸 글자가 다르면 false
15+
if (
16+
row < 0 ||
17+
row >= rows ||
18+
col < 0 ||
19+
col >= cols ||
20+
board[row][col] !== word[index]
21+
) {
22+
return false;
23+
}
24+
25+
// 방문 처리 (임시로 다른 문자로 바꿔줌)
26+
const temp = board[row][col];
27+
board[row][col] = "#";
28+
29+
// 상하좌우로 이동하면서 다음 글자 찾기
30+
const found =
31+
backtrack(row + 1, col, index + 1) || // 아래
32+
backtrack(row - 1, col, index + 1) || // 위
33+
backtrack(row, col + 1, index + 1) || // 오른쪽
34+
backtrack(row, col - 1, index + 1); // 왼쪽
35+
36+
// 복구 (다시 원래 문자로 되돌리기)
37+
board[row][col] = temp;
38+
39+
return found;
40+
}
41+
42+
// board 전체 돌면서 시작점 찾기
43+
for (let row = 0; row < rows; row++) {
44+
for (let col = 0; col < cols; col++) {
45+
if (backtrack(row, col, 0)) {
46+
return true;
47+
}
48+
}
49+
}
50+
51+
return false;
52+
};

0 commit comments

Comments
 (0)