Skip to content

Commit f8f2c31

Browse files
authored
[tigermint] WEEK 04 Solutions (#2748)
* feat: WEEK 04 solution (merge-two-sorted-lists) * feat: WEEK 04 solution (maximum-depth-of-binary-tree) * feat: WEEK 04 solution (find-minimum-in-rotated-sorted-array) * feat: WEEK 04 solution (word-search) * feat: WEEK 04 solution (coin-change) * refactor: WEEK 04 remove unnecessary non-null assertions (!!)
1 parent bc97a50 commit f8f2c31

5 files changed

Lines changed: 149 additions & 0 deletions

File tree

coin-change/tigermint.kt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
class Solution {
2+
fun coinChange(coins: IntArray, amount: Int): Int {
3+
val dp = IntArray(amount + 1) { amount + 1 }
4+
dp[0] = 0
5+
6+
for (i in 1..amount) {
7+
for (c in coins) {
8+
if (i - c >= 0) {
9+
dp[i] = minOf(dp[i], dp[i - c] + 1)
10+
}
11+
}
12+
}
13+
14+
return if (dp[amount] > amount) - 1 else dp[amount]
15+
}
16+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
class Solution {
2+
fun findMin(nums: IntArray): Int {
3+
var left = 0
4+
var right = nums.size - 1
5+
6+
while (left < right) {
7+
val mid = (left + right) / 2
8+
9+
when {
10+
nums[mid] > nums[right] -> left = mid + 1 // 오른쪽 존재
11+
nums[mid] <= nums[right] -> right = mid // 왼쪽 존재 or 나 자신
12+
}
13+
}
14+
15+
return nums[left]
16+
}
17+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/**
2+
* Example:
3+
* var ti = TreeNode(5)
4+
* var v = ti.`val`
5+
* Definition for a binary tree node.
6+
* class TreeNode(var `val`: Int) {
7+
* var left: TreeNode? = null
8+
* var right: TreeNode? = null
9+
* }
10+
*/
11+
class Solution {
12+
fun maxDepth(root: TreeNode?): Int {
13+
if (root == null) return 0
14+
15+
var maxDepth = 0
16+
17+
fun dfs(node: TreeNode, depth: Int) {
18+
//leaf node
19+
if (node.left == null && node.right == null) maxDepth = maxOf(maxDepth, depth)
20+
21+
if (node.left != null) dfs(node.left!!, depth + 1)
22+
if (node.right != null) dfs(node.right!!, depth + 1)
23+
}
24+
25+
dfs(root, 1)
26+
27+
return maxDepth
28+
}
29+
30+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/**
2+
* Example:
3+
* var li = ListNode(5)
4+
* var v = li.`val`
5+
* Definition for singly-linked list.
6+
* class ListNode(var `val`: Int) {
7+
* var next: ListNode? = null
8+
* }
9+
*/
10+
class Solution {
11+
fun mergeTwoLists(list1: ListNode?, list2: ListNode?): ListNode? {
12+
val head = ListNode(0)
13+
var tail = head
14+
var l1 = list1
15+
var l2 = list2
16+
17+
while (l1 != null && l2 != null) {
18+
if (l1.`val` <= l2.`val`) {
19+
tail.next = l1
20+
l1 = l1.next
21+
} else {
22+
tail.next = l2
23+
l2 = l2.next
24+
}
25+
26+
tail = tail.next!!
27+
}
28+
29+
tail.next = l1 ?: l2
30+
31+
return head.next
32+
}
33+
}

word-search/tigermint.kt

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
class Solution {
2+
3+
private val dx = intArrayOf(-1, 1, 0, 0)
4+
private val dy = intArrayOf(0, 0, -1, 1)
5+
6+
fun exist(board: Array<CharArray>, word: String): Boolean {
7+
val rows = board.size
8+
val cols = board[0].size
9+
val visited = Array(rows) { BooleanArray(cols) }
10+
11+
val starts = mutableListOf<Pair<Int, Int>>()
12+
for (i in 0 until rows) {
13+
for (j in 0 until cols) {
14+
if (board[i][j] == word[0]) starts.add(i to j)
15+
}
16+
}
17+
18+
if (word.length == 1) return starts.isNotEmpty()
19+
20+
var flag = false
21+
22+
fun dfs(start: Pair<Int, Int>, index: Int) {
23+
if (flag) return
24+
if (index == word.length - 1) {
25+
flag = true
26+
return
27+
}
28+
29+
for (i in 0 until 4) {
30+
val nx = start.first + dx[i]
31+
val ny = start.second + dy[i]
32+
33+
if (nx < 0 || nx >= rows) continue
34+
if (ny < 0 || ny >= cols) continue
35+
if (visited[nx][ny]) continue
36+
if (word[index + 1] != board[nx][ny]) continue
37+
38+
visited[nx][ny] = true
39+
dfs(Pair(nx, ny), index + 1)
40+
visited[nx][ny] = false
41+
}
42+
}
43+
44+
for (start in starts) {
45+
visited[start.first][start.second] = true
46+
dfs(start, 0)
47+
visited[start.first][start.second] = false
48+
if (flag) return true
49+
}
50+
51+
return false
52+
}
53+
}

0 commit comments

Comments
 (0)