Skip to content

Commit 4d3d624

Browse files
Merge pull request #1813 from hyunjung-choi/main
[hyunjung-choi] WEEK 04 solutions
2 parents 069e5e0 + 31ed2cd commit 4d3d624

File tree

5 files changed

+139
-0
lines changed

5 files changed

+139
-0
lines changed

โ€Žcoin-change/hyunjung-choi.kt

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
/**
2+
* ์‹œ๊ฐ„๋ณต์žก๋„: O(amount ร— coins.length)
3+
* ๊ณต๊ฐ„๋ณต์žก๋„: O(amount)
4+
*/
5+
6+
class Solution {
7+
fun coinChange(coins: IntArray, amount: Int): Int {
8+
val dp = IntArray(amount + 1) { Int.MAX_VALUE }
9+
dp[0] = 0
10+
11+
for (i in 1..amount) {
12+
for (coin in coins) {
13+
if (i - coin >= 0 && dp[i - coin] != Int.MAX_VALUE) {
14+
dp[i] = minOf(dp[i], dp[i - coin] + 1)
15+
}
16+
}
17+
}
18+
19+
return if (dp[amount] == Int.MAX_VALUE) -1 else dp[amount]
20+
}
21+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// ์‹œ๊ฐ„ ๋ณต์žก๋„: O(log n)
2+
// - n: ๋ฐฐ์—ด์˜ ๊ธธ์ด
3+
// - ๋งค ๋ฐ˜๋ณต๋งˆ๋‹ค ํƒ์ƒ‰ ๋ฒ”์œ„๋ฅผ ์ ˆ๋ฐ˜์œผ๋กœ ์ค„์ด๋Š” ์ด์ง„ ํƒ์ƒ‰์ด๋ฏ€๋กœ O(log n)
4+
//
5+
// ๊ณต๊ฐ„ ๋ณต์žก๋„: O(1)
6+
// - ์ถ”๊ฐ€์ ์ธ ๋ฐฐ์—ด์ด๋‚˜ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ ,
7+
// ๋ณ€์ˆ˜(left, right, mid)๋งŒ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์ƒ์ˆ˜ ๊ณต๊ฐ„
8+
9+
class Solution {
10+
fun findMin(nums: IntArray): Int {
11+
var left = 0
12+
var right = nums.size - 1
13+
14+
while (left < right) {
15+
val mid = left + (right - left) / 2
16+
17+
if (nums[mid] > nums[right]) {
18+
left = mid + 1
19+
} else {
20+
right = mid
21+
}
22+
}
23+
24+
return nums[left]
25+
}
26+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
// ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n)
2+
// - n: ํŠธ๋ฆฌ์˜ ๋…ธ๋“œ ๊ฐœ์ˆ˜
3+
// - ๊ฐ ๋…ธ๋“œ๋ฅผ ์ •ํ™•ํžˆ ํ•œ ๋ฒˆ์”ฉ ๋ฐฉ๋ฌธํ•˜๋ฏ€๋กœ O(n)
4+
//
5+
// ๊ณต๊ฐ„ ๋ณต์žก๋„: O(h)
6+
// - h: ํŠธ๋ฆฌ์˜ ๋†’์ด
7+
// - ์žฌ๊ท€ ํ˜ธ์ถœ ์Šคํƒ์— ์ตœ๋Œ€ h๊ฐœ์˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ์Œ“์ž„
8+
// - ์ตœ์•…์˜ ๊ฒฝ์šฐ(ํŽธํ–ฅ ํŠธ๋ฆฌ) h = n ์ด๋ฏ€๋กœ O(n),
9+
// ์ตœ์„ ์˜ ๊ฒฝ์šฐ(๊ท ํ˜• ํŠธ๋ฆฌ) h = log n ์ด๋ฏ€๋กœ O(log n)
10+
11+
class Solution {
12+
fun maxDepth(root: TreeNode?): Int {
13+
if (root == null) return 0
14+
15+
val leftDepth = maxDepth(root.left)
16+
val rightDepth = maxDepth(root.right)
17+
18+
return maxOf(leftDepth, rightDepth) + 1
19+
}
20+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
// ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n + m)
2+
// - n: list1์˜ ๊ธธ์ด, m: list2์˜ ๊ธธ์ด
3+
// - ๋‘ ๋ฆฌ์ŠคํŠธ๋ฅผ ํ•œ ๋ฒˆ์”ฉ๋งŒ ์ˆœํšŒํ•˜๋ฉฐ ๋ณ‘ํ•ฉํ•˜๋ฏ€๋กœ O(n + m)
4+
//
5+
// ๊ณต๊ฐ„ ๋ณต์žก๋„: O(1)
6+
// - ์ฃผ์–ด์ง„ ๋…ธ๋“œ๋“ค์„ ์žฌ์‚ฌ์šฉํ•˜์—ฌ ๋ณ‘ํ•ฉํ•˜๊ณ , ์ถ”๊ฐ€๋กœ ๋”๋ฏธ ๋…ธ๋“œ(dummy) ํ•˜๋‚˜๋งŒ ์‚ฌ์šฉ
7+
// - ์žฌ๊ท€ ํ˜ธ์ถœ ์—†์ด ํฌ์ธํ„ฐ๋งŒ ์ด๋™ํ•˜๋ฏ€๋กœ ์ƒ์ˆ˜ ๊ณต๊ฐ„๋งŒ ํ•„์š”
8+
9+
class Solution {
10+
fun mergeTwoLists(list1: ListNode?, list2: ListNode?): ListNode? {
11+
val dummy = ListNode(0)
12+
var current = dummy
13+
14+
var p1 = list1
15+
var p2 = list2
16+
17+
while (p1 != null && p2 != null) {
18+
if (p1.`val` >= p2.`val`) {
19+
current.next = p2
20+
p2 = p2.next
21+
} else {
22+
current.next = p1
23+
p1 = p1.next
24+
}
25+
26+
current = current.next!!
27+
}
28+
29+
current.next = p1 ?: p2
30+
31+
return dummy.next
32+
}
33+
}

โ€Žword-search/hyunjung-choi.kt

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
/*
2+
* ์‹œ๊ฐ„ ๋ณต์žก๋„ (R=ํ–‰, C=์—ด, N=R*C, L=word.length)
3+
* - ๋ชจ๋“  ์นธ(N๊ฐœ)์—์„œ ์‹œ์ž‘ ๊ฐ€๋Šฅ.
4+
* - DFS ํ•œ ๋‹จ๊ณ„์—์„œ ์ตœ๋Œ€ 4๋ฐฉํ–ฅ, ๋‹ค์Œ ๋‹จ๊ณ„๋ถ€ํ„ฐ๋Š” ๋˜๋Œ์•„๊ฐˆ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์ตœ๋Œ€ 3๋ฐฉํ–ฅ์œผ๋กœ ๋ถ„๊ธฐ.
5+
* - ์ตœ์•…: N * (4 * 3^(L-1)) = O(R*C*3^L).
6+
*
7+
* ๊ณต๊ฐ„ ๋ณต์žก๋„
8+
* - visited ๋ฐฐ์—ด: O(R*C)
9+
* - ์žฌ๊ท€ ์ฝœ์Šคํƒ: ๊ฒฝ๋กœ ๊ธธ์ด ์ตœ๋Œ€ L โ†’ O(L)
10+
* - ์ดํ•ฉ: O(R*C + L) (์ตœ์•… ๊ธฐ์ค€์€ O(R*C))
11+
*/
12+
13+
class Solution {
14+
fun exist(board: Array<CharArray>, word: String): Boolean {
15+
if (word.isEmpty()) return true
16+
17+
val rows = board.size
18+
val cols = board.firstOrNull()?.size ?: return false
19+
val visited = Array(rows) { BooleanArray(cols) }
20+
val directions = arrayOf(1 to 0, -1 to 0, 0 to 1, 0 to -1)
21+
22+
fun dfs(r: Int, c: Int, index: Int): Boolean {
23+
if (index == word.length) return true
24+
if (r !in 0 until rows || c !in 0 until cols) return false
25+
if (visited[r][c] || board[r][c] != word[index]) return false
26+
27+
visited[r][c] = true
28+
val found = directions.any { (dr, dc) -> dfs(r + dr, c + dc, index + 1) }
29+
visited[r][c] = false
30+
return found
31+
}
32+
33+
return board.indices.any { r ->
34+
board[0].indices.any { c ->
35+
board[r][c] == word[0] && dfs(r, c, 0)
36+
}
37+
}
38+
}
39+
}

0 commit comments

Comments
ย (0)