Skip to content

Commit 4fc8986

Browse files
committed
5번 문제 추가
1 parent 9826966 commit 4fc8986

File tree

4 files changed

+105
-11
lines changed

4 files changed

+105
-11
lines changed

contains-duplicate/jdalma.kt

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,12 @@ import org.junit.jupiter.api.Test
66
class `contains-duplicate`{
77

88
fun containsDuplicate(nums: IntArray): Boolean {
9-
return third(nums)
9+
return usingSet(nums)
1010
}
1111

12-
// 시간초과
12+
// 1. 중첩 반복문 - 시간초과
1313
// 시간복잡도: O(n^2), 공간복잡도: O(1)
14-
private fun first(nums: IntArray): Boolean {
14+
private fun usingNestedLoop(nums: IntArray): Boolean {
1515
nums.forEachIndexed { i, e1 ->
1616
nums.forEachIndexed { j, e2 ->
1717
if (i != j && e1 == e2) {
@@ -22,8 +22,9 @@ class `contains-duplicate`{
2222
return false
2323
}
2424

25+
// 2. 정렬 후 순회
2526
// 시간복잡도: O(n * log(n)), 공간복잡도: O(1)
26-
private fun second(nums: IntArray): Boolean {
27+
private fun usingSort(nums: IntArray): Boolean {
2728
nums.sort() // DualPivotQuicksort -> O(n log(n))
2829
for (index in 1 until nums.size) {
2930
val prev = nums[index - 1]
@@ -35,8 +36,9 @@ class `contains-duplicate`{
3536
return false
3637
}
3738

39+
// 3. 자료구조 Set 사용
3840
// 시간복잡도: O(n), 공간복잡도: O(n)
39-
private fun third(nums: IntArray): Boolean {
41+
private fun usingSet(nums: IntArray): Boolean {
4042
val set = nums.toSet()
4143
return nums.size != set.size
4244
}

number-of-1-bits/jdalma.kt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,12 @@ import org.junit.jupiter.api.Test
66
class `number-of-1-bits` {
77

88
fun hammingWeight(n: Int): Int {
9-
return second(n)
9+
return bitOperation(n)
1010
}
1111

12+
// 1. 직접 2진수를 구함
1213
// 시간복잡도: O(log n), 공간복잡도: O(1)
13-
private fun first(n: Int): Int {
14+
private fun binary(n: Int): Int {
1415
var calc = n
1516
var count = 0
1617
while(calc > 0) {
@@ -22,8 +23,9 @@ class `number-of-1-bits` {
2223
return count
2324
}
2425

26+
// 2. 비트 논리 연산자 사용
2527
// 시간복잡도: O(log n), 공간복잡도: O(1)
26-
private fun second(n: Int): Int {
28+
private fun bitOperation(n: Int): Int {
2729
var calc = n
2830
var count = 0
2931
while (calc > 0) {

palindromic-substrings/jdalma.kt

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
package leetcode_study
2+
3+
import io.kotest.matchers.equals.shouldBeEqual
4+
import org.junit.jupiter.api.Test
5+
6+
class `palindromic-substrings` {
7+
8+
fun countSubstrings(s: String): Int {
9+
return dp(s)
10+
}
11+
12+
// 1. 브루트포스 3중 반복문
13+
// 시간복잡도: O(n^3), 공간복잡도: O(1)
14+
private fun bruteForce(s: String): Int {
15+
16+
fun isPalindrome(text: String, left: Int, right: Int): Boolean {
17+
var (start, end) = left to right
18+
while (start < end) {
19+
if (text[start] != text[end]) {
20+
return false
21+
}
22+
start++
23+
end--
24+
}
25+
return true
26+
}
27+
28+
var count = 0
29+
s.indices.forEachIndexed { left, _ ->
30+
(left until s.length).forEach { right ->
31+
if (isPalindrome(s, left, right)) {
32+
count++
33+
}
34+
}
35+
}
36+
return count
37+
}
38+
39+
// 2. 문자열의 길이가 홀수,짝수를 감안하여 특정 지점부터 두 개의 포인터 left , right를 비교한다.
40+
// 시간복잡도: O(n^2), 공간복잡도: O(1)
41+
private fun twoPointer(s: String): Int {
42+
43+
fun palindromeCount(text: String, left: Int, right: Int): Int {
44+
var count = 0
45+
var (l , r) = left to right
46+
while (l >= 0 && r < text.length && text[l--] == text[r++]) {
47+
count++
48+
}
49+
return count
50+
}
51+
52+
var result = 0
53+
s.indices.forEachIndexed { index, e ->
54+
val even = palindromeCount(s, index, index + 1)
55+
val odd = palindromeCount(s, index - 1, index + 1)
56+
result += even + odd + 1
57+
}
58+
59+
return result
60+
}
61+
62+
// 3. DP : 이전에 비교했던 결과를 기억하여 (현재 주어진 start, end 비교) && (이전 start, end 비교)
63+
// 시간복잡도: O(n^2), 공간복잡도: O(n^2)
64+
private fun dp(s: String): Int {
65+
val len = s.length
66+
val dp = Array(len) { BooleanArray(len) { false } }
67+
68+
for (end in 0 until len) {
69+
for (start in end downTo 0) {
70+
if (start == end) {
71+
dp[start][end] = true
72+
} else if (start + 1 == end) {
73+
dp[start][end] = s[start] == s[end]
74+
} else {
75+
dp[start][end] = s[start] == s[end] && dp[start + 1][end - 1]
76+
}
77+
}
78+
}
79+
80+
return dp.sumOf { row -> row.count { it } }
81+
}
82+
83+
@Test
84+
fun `주어진 문자열의 회문인 부분 문자열의 개수를 반환한다`() {
85+
countSubstrings("abc") shouldBeEqual 3
86+
countSubstrings("aaa") shouldBeEqual 6
87+
countSubstrings("ababa") shouldBeEqual 9
88+
countSubstrings("abcda") shouldBeEqual 5
89+
}
90+
}

top-k-frequent-elements/jdalma.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ class `top-k-frequent-elements` {
1010
return third(nums, k)
1111
}
1212

13-
// Map 정렬
13+
// 1. Map 정렬
1414
// 시간복잡도: O(n * log(n)), 공간복잡도: O(n)
1515
private fun first(nums: IntArray, k: Int): IntArray {
1616
val map = mutableMapOf<Int, Int>()
@@ -28,7 +28,7 @@ class `top-k-frequent-elements` {
2828
.toIntArray()
2929
}
3030

31-
// 우선순위 큐
31+
// 2. 우선순위 큐
3232
// 시간복잡도: O(n * log(k)), 공간복잡도: O(n + k)
3333
private fun second(nums: IntArray, k: Int): IntArray {
3434
val map = mutableMapOf<Int, Int>()
@@ -44,7 +44,7 @@ class `top-k-frequent-elements` {
4444
return (0 until k).map { heap.poll().key }.toIntArray()
4545
}
4646

47-
// 이차원배열로 빈번도 저장
47+
// 3. 이차원배열로 빈번도 저장
4848
// 시간복잡도: O(n), 공간복잡도: O(n)
4949
private fun third(nums: IntArray, k: Int): IntArray {
5050
val map = mutableMapOf<Int, Int>()

0 commit comments

Comments
 (0)