Skip to content

Commit 9826966

Browse files
committed
복잡도 정리 및 1주차 4번 문제 추가
1 parent 03b0953 commit 9826966

File tree

4 files changed

+109
-2
lines changed

4 files changed

+109
-2
lines changed

contains-duplicate/jdalma.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ class `contains-duplicate`{
1010
}
1111

1212
// 시간초과
13+
// 시간복잡도: O(n^2), 공간복잡도: O(1)
1314
private fun first(nums: IntArray): Boolean {
1415
nums.forEachIndexed { i, e1 ->
1516
nums.forEachIndexed { j, e2 ->
@@ -21,8 +22,9 @@ class `contains-duplicate`{
2122
return false
2223
}
2324

25+
// 시간복잡도: O(n * log(n)), 공간복잡도: O(1)
2426
private fun second(nums: IntArray): Boolean {
25-
nums.sort() // DualPivotQuicksort
27+
nums.sort() // DualPivotQuicksort -> O(n log(n))
2628
for (index in 1 until nums.size) {
2729
val prev = nums[index - 1]
2830
val curr = nums[index]
@@ -33,6 +35,7 @@ class `contains-duplicate`{
3335
return false
3436
}
3537

38+
// 시간복잡도: O(n), 공간복잡도: O(n)
3639
private fun third(nums: IntArray): Boolean {
3740
val set = nums.toSet()
3841
return nums.size != set.size
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
package leetcode_study
2+
3+
import io.kotest.matchers.equals.shouldBeEqual
4+
import org.junit.jupiter.api.Test
5+
import java.util.PriorityQueue
6+
7+
class `kth-smallest-element-in-a-bst` {
8+
9+
fun kthSmallest(root: TreeNode?, k: Int): Int {
10+
return inorderTraversal(root, k)
11+
}
12+
13+
// 1. 재귀 호출로 모든 트리를 조회 후 정렬
14+
// 시간복잡도: O(n * log(n)), 공간복잡도: O(n)
15+
private fun recursionAndSort(root: TreeNode?, k: Int) = mutableSetOf<Int>().apply {
16+
dfs(root, this)
17+
}.sorted()[k - 1]
18+
19+
private fun dfs(node: TreeNode?, set: MutableSet<Int>) {
20+
if (node == null) return
21+
22+
set.add(node.`val`)
23+
dfs(node.left, set)
24+
dfs(node.right, set)
25+
}
26+
27+
// 2. 재귀 호출로 모든 트리의 값을 우선순위 큐에 삽입하고 작은 값으로 계속 큐를 갱신
28+
// 시간복잡도: O(n * log(k)), 공간복잡도: O(n + k)
29+
// 트리 순회 : O(n), 우선순위 큐 삽입: O(log k)
30+
private fun usingPriorityQueue(node: TreeNode?, k: Int): Int {
31+
fun dfs(node: TreeNode, k: Int, pq: PriorityQueue<Int>) {
32+
pq.offer(node.`val`)
33+
34+
if (pq.size > k) {
35+
pq.poll()
36+
}
37+
if (node.left != null) {
38+
dfs(node.left!!, k, pq)
39+
}
40+
if (node.right != null) {
41+
dfs(node.right!!, k, pq)
42+
}
43+
}
44+
45+
val pq = PriorityQueue { v1: Int, v2: Int -> v2 - v1 }
46+
dfs(node!!, k, pq)
47+
return pq.first()
48+
}
49+
50+
// 3. 문제의 전제가 이진탐색트리이기에, 중위순회로 탐색하여 값을 누적하면 오름차순의 값이 된다.
51+
// 시간복잡도: O(n), 공간복잡도: O(n)
52+
private fun inorderTraversal(node: TreeNode?, k: Int): Int {
53+
fun dfs(node: TreeNode, k: Int, list: MutableList<Int>) {
54+
if (node.left != null) {
55+
dfs(node.left!!, k, list)
56+
}
57+
list.add(node.`val`)
58+
if (node.right != null) {
59+
dfs(node.right!!, k, list)
60+
}
61+
}
62+
63+
return mutableListOf<Int>().apply {
64+
dfs(node!!, k, this)
65+
}[k - 1]
66+
}
67+
68+
@Test
69+
fun `루트와 정수 k가 주어지면 트리에 있는 모든 노드의 값 중 가장 작은 값을 반환한다`() {
70+
kthSmallest(TreeNode.of(listOf(0, 3,1,4,null,2)), 1) shouldBeEqual 1
71+
kthSmallest(TreeNode.of(listOf(0, 5,3,6,2,4,null,null,1)), 3) shouldBeEqual 3
72+
}
73+
}
74+
75+
class TreeNode(var `val`: Int) {
76+
var left: TreeNode? = null
77+
var right: TreeNode? = null
78+
79+
companion object {
80+
fun of(numbers: List<Int?>): TreeNode? {
81+
fun setChild(node: TreeNode?, nums: List<Int?>, index: Int): TreeNode? {
82+
if (node == null) return null
83+
val (leftIndex, rightIndex) = index * 2 to index * 2 + 1
84+
85+
if (leftIndex < nums.size && nums[leftIndex] != null) {
86+
node.left = TreeNode(nums[leftIndex]!!)
87+
setChild(node.left, nums, leftIndex)
88+
}
89+
if (rightIndex < nums.size && nums[rightIndex] != null) {
90+
node.right = TreeNode(nums[rightIndex]!!)
91+
setChild(node.right, nums, rightIndex)
92+
}
93+
return node
94+
}
95+
return setChild(TreeNode(numbers[1]!!), numbers, 1)
96+
}
97+
}
98+
}

number-of-1-bits/jdalma.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ class `number-of-1-bits` {
99
return second(n)
1010
}
1111

12+
// 시간복잡도: O(log n), 공간복잡도: O(1)
1213
private fun first(n: Int): Int {
1314
var calc = n
1415
var count = 0
@@ -21,6 +22,7 @@ class `number-of-1-bits` {
2122
return count
2223
}
2324

25+
// 시간복잡도: O(log n), 공간복잡도: O(1)
2426
private fun second(n: Int): Int {
2527
var calc = n
2628
var count = 0

top-k-frequent-elements/jdalma.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ class `top-k-frequent-elements` {
1111
}
1212

1313
// Map 정렬
14+
// 시간복잡도: O(n * log(n)), 공간복잡도: O(n)
1415
private fun first(nums: IntArray, k: Int): IntArray {
1516
val map = mutableMapOf<Int, Int>()
1617

@@ -27,7 +28,8 @@ class `top-k-frequent-elements` {
2728
.toIntArray()
2829
}
2930

30-
// 우선순위 큐 사용
31+
// 우선순위 큐
32+
// 시간복잡도: O(n * log(k)), 공간복잡도: O(n + k)
3133
private fun second(nums: IntArray, k: Int): IntArray {
3234
val map = mutableMapOf<Int, Int>()
3335

@@ -43,6 +45,7 @@ class `top-k-frequent-elements` {
4345
}
4446

4547
// 이차원배열로 빈번도 저장
48+
// 시간복잡도: O(n), 공간복잡도: O(n)
4649
private fun third(nums: IntArray, k: Int): IntArray {
4750
val map = mutableMapOf<Int, Int>()
4851

@@ -74,5 +77,6 @@ class `top-k-frequent-elements` {
7477
topKFrequent(intArrayOf(1,1,1,2,2,3,3,4), 3) shouldBe intArrayOf(1,2,3)
7578
topKFrequent(intArrayOf(2,2,3,3,1,1,4), 3) shouldBe intArrayOf(2,3,1)
7679
topKFrequent(intArrayOf(4,1,-1,2,-1,2,3), 2) shouldBe intArrayOf(-1,2)
80+
7781
}
7882
}

0 commit comments

Comments
 (0)