Skip to content

Commit a7c348f

Browse files
authored
Merge pull request #718 from EcoFriendlyAppleSu/main
[์นœํ™˜๊ฒฝ์‚ฌ๊ณผ] Week 2
2 parents 61fa050 + 63eacca commit a7c348f

File tree

4 files changed

+208
-0
lines changed

4 files changed

+208
-0
lines changed

โ€Ž3sum/EcoFriendlyAppleSu.ktโ€Ž

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
package leetcode_study
2+
3+
/**
4+
* ์ฃผ์–ด์ง„ ๋ฐฐ์—ด์˜ ์„ธ ์›์†Œ์˜ ํ•ฉ์ด 0์ธ ๊ฒฝ์šฐ๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ. (์„ธ ๊ฐœ์˜ ๊ฐ’์˜ ๊ฒฐ๊ณผ๋Š” ์ค‘๋ณต๋˜์ง€ ์•Š์Œ)
5+
*
6+
* ์ฃผ์–ด์ง„ ์กฐ๊ฑด
7+
* 3 <= nums.length <= 3000
8+
* -105 <= nums[i] <= 105
9+
*/
10+
11+
/**
12+
* case01. ์กฐํ•ฉ์„ ์‚ฌ์šฉํ•œ ํ’€์ด.
13+
* ์‹œ๊ฐ„ ์ดˆ๊ณผ ๋ฐœ์ƒ ์ด์œ 
14+
* -> ๋ชจ๋“  ๊ฐ€๋Šฅํ•œ ์„ธ ๊ฐœ์˜ ์กฐํ•ฉ์„ ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒ.
15+
* ์‹œ๊ฐ„ ๋ณต์žก๋„:
16+
* -> ์„ธ ๊ฐœ์˜ ์กฐํ•ฉ ์ƒ์„ฑ ๊ณผ์ •: O(n * (n-1) * (n-2)) / 3. ์ตœ์•…์˜ ๊ฒฝ์šฐ n = 3000, 4.5 ์–ต๊ฐœ ์กฐํ•ฉ ์ƒ์„ฑ
17+
* -> ์„ธ ๊ฐœ์˜ ์กฐํ•ฉ ๊ฒฐ๊ณผ sorting ๊ณผ์ •: O(klogk). k = 3
18+
* -> ๊ฒฐ๊ณผ๊ฐ’์„ ํ•„ํ„ฐ๋งํ•ด ํ•ฉ์ด 0์ธ ๋ฐฐ์—ด์„ ํ•„ํ„ฐํ•˜๋Š” ๊ณผ์ •: O(n)
19+
* ๋‚˜๋จธ์ง€ ์—ฐ์‚ฐ์ด ์„ธ ๊ฐœ์˜ ์กฐํ•ฉ ์ƒ์„ฑ ๊ณผ์ •์— ์˜ํ–ฅ์„ ๋ฐ›์•„ ๊ณ„์‚ฐ ํšŸ์ˆ˜ ์ฆ๊ฐ€.
20+
*
21+
* ๊ณต๊ฐ„ ๋ณต์žก๋„:
22+
* -> ๊ฐ ์กฐํ•ฉ์„ ๋ชจ๋‘ ์ €์žฅ: O(n^3)
23+
*/
24+
fun threeSumUseCombination(nums: IntArray): List<List<Int>> {
25+
// ๊ฒฐ๊ณผ๋ฅผ ๋‹ด์„ Set ์ž๋ฃŒ๊ตฌ์กฐ
26+
val processResult = mutableSetOf<List<Int>>()
27+
28+
// ์ฃผ์–ด์ง„ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋ฅผ ๋‹ด๋Š” ๋ณ€์ˆ˜
29+
val maxNumber = nums.size
30+
31+
// ์กฐํ•ฉ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ
32+
val givenSize = 3
33+
34+
// ๋‚˜ํƒ€๋‚ผ ์ธ๋ฑ์Šค๋ฅผ ๊ตฌํ•˜๋Š” ๋ฐฐ์—ด ์ดˆ๊ธฐํ™”
35+
val indices = IntArray(givenSize)
36+
for (i in 0 until givenSize) {
37+
indices[i] = i
38+
}
39+
40+
while (indices[givenSize - 1] < maxNumber) {
41+
processResult.add(indices.map { nums[it] }.sorted())
42+
var i = givenSize - 1
43+
44+
while (i >= 0 && indices[i] == i + maxNumber - givenSize) {
45+
i--
46+
}
47+
48+
if (i >= 0) {
49+
indices[i]++
50+
for (j in i + 1 until givenSize) {
51+
indices[j] = indices[j-1] + 1
52+
}
53+
} else break
54+
}
55+
56+
return processResult.filter { it.sum() == 0 }
57+
}
58+
59+
/**
60+
* case02. ํˆฌ ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•œ ํ’€์ด
61+
* ์กฐํ•ฉ์„ ์‚ฌ์šฉํ•œ ํ’€์ด์™€ ๋‹ฌ๋ฆฌ ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Œ. O(n^3)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ O(n^2)์œผ๋กœ ์ค„์ž„
62+
*
63+
* ์‹œ๊ฐ„ ๋ณต์žก๋„:
64+
* -> ์ฃผ์–ด์ง„ ์ˆซ์ž ๋ฐฐ์—ด ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ: O(nlogn)
65+
* -> ์„ธ ๊ฐœ์˜ ์ˆซ์ž๋ฅผ ๋”ํ•˜๋Š” ๋กœ์ง
66+
* -> ์™ธ๋ถ€ ๋ฐ˜๋ณต๋ฌธ์„ ํ†ตํ•ด ์ฃผ์–ด์ง„ ๋ฐฐ์—ด ์ „์ฒด ์กฐํšŒ: O(n)
67+
* -> ๋‚ด๋ถ€ ๋ฐ˜๋ณต๋ฌธ์„ ํ†ตํ•ด start to last index ์ˆœํšŒ: O(n)
68+
* -> O(n^2)
69+
* โˆด O(nlogn) + O(n^2) => O(n^2)
70+
*
71+
* ๊ณต๊ฐ„ ๋ณต์žก๋„:
72+
* -> ์ฃผ์–ด์ง„ ์ˆซ์ž ๋ฐฐ์—ด์˜ ์ •๋ ฌ์„ ๋‹ด๋Š” ๊ณต๊ฐ„ ํ•„์š”: O(n)
73+
*/
74+
fun threeSum(nums: IntArray): List<List<Int>> {
75+
val processResult = mutableListOf<List<Int>>()
76+
val sortedNums = nums.sorted()
77+
78+
for (i in sortedNums.indices) {
79+
if (i > 0 && sortedNums[i] == sortedNums[i-1]) continue
80+
81+
var startIndex = i + 1
82+
var lastIndex = sortedNums.size - 1
83+
84+
while (startIndex < lastIndex) {
85+
val sum = sortedNums[i] + sortedNums[startIndex] + sortedNums[lastIndex]
86+
when {
87+
sum == 0 -> {
88+
processResult.add(listOf(sortedNums[i], sortedNums[startIndex], sortedNums[lastIndex]))
89+
while (startIndex < lastIndex && sortedNums[startIndex] == sortedNums[startIndex + 1]) startIndex++
90+
while (startIndex < lastIndex && sortedNums[lastIndex] == sortedNums[lastIndex - 1]) lastIndex--
91+
startIndex++
92+
lastIndex--
93+
}
94+
sum < 0 -> {
95+
startIndex++
96+
}
97+
else -> {
98+
lastIndex--
99+
}
100+
}
101+
}
102+
}
103+
return processResult
104+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package leetcode_study
2+
3+
/**
4+
* ๊ณ„๋‹จ์— ์˜ฌ๋ผ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•
5+
* ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n)
6+
* -> ์ฃผ์–ด์ง„ ํšŸ์ˆ˜ ๋งŒํผ ๋ฐ˜๋ณต ์ง„ํ–‰
7+
* ๊ณต๊ฐ„ ๋ณต์žก๋„: O(k)
8+
* -> ์ฃผ์–ด์ง„ ๊ณ„๋‹จ ์ˆ˜ ๋งŒํผ ํšŸ์ˆ˜๋ฅผ ์ €์žฅํ•  ๊ณต๊ฐ„ ํ•„์š”
9+
*/
10+
fun climbStairs(n: Int): Int {
11+
val step = IntArray(n+1)
12+
13+
if (n == 1) {
14+
return 1
15+
}
16+
step[1] = 1
17+
step[2] = 2
18+
19+
for (i in 3 until step.size) {
20+
step[i] = step[i-1] + step[i-2]
21+
}
22+
23+
return step[n]
24+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package leetcode_study
2+
3+
/**
4+
* ์ „์œ„ ์ˆœํšŒ, ์ค‘์œ„ ์ˆœํšŒ๋ฅผ ํ†ตํ•œ ์›๋ณธ Binary Tree๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ
5+
*
6+
* ์ „์œ„ ์ˆœํšŒ ํƒ์ƒ‰ ์ˆœ์„œ : ๋ฃจํŠธ -> ์™ผ์ชฝ ์„œ๋ธŒ ํŠธ๋ฆฌ -> ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒ ํŠธ๋ฆฌ
7+
* ์ค‘์œ„ ์ˆœํšŒ ํƒ์ƒ‰ ์ˆœ์„œ : ์™ผ์ชฝ ์„œ๋ธŒ ํŠธ๋ฆฌ -> ๋ฃจํŠธ -> ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒ ํŠธ๋ฆฌ
8+
* ํƒ์ƒ‰์€ ๋™์ผํ•œ Binary Tree๋ฅผ ๋‘๊ณ  ์ง„ํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฐ์—ด์˜ ๊ธธ์ด๋Š” ๊ฐ™์Šต๋‹ˆ๋‹ค.
9+
*
10+
* ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n^2)
11+
* -> Ary RootNode Index ๋ฅผ ์ฐพ๋Š” ๊ณผ์ •: O(n)
12+
* -> ์žฌ๊ท€ ์•ˆ์—์„œ RootNode Index ๋ฅผ ์ฐพ๋Š” ๊ณผ์ •: O(n)
13+
* --> ๋‘ ๊ณ„์˜ ๊ณผ์ •์€ ๋ณ„๋„๋กœ ์กด์žฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ๋‚ด๋ถ€์ ์œผ๋กœ ์ผ์–ด๋‚˜๊ธฐ ๋•Œ๋ฌธ์— O(n) * O(n). ์ฆ‰, O(n^2)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ ์†Œ์š”๋จ
14+
*
15+
* ๊ณต๊ฐ„ ๋ณต์žก๋„: O(n) or O(logn)
16+
* -> ์žฌ๊ท€๋ฅผ ํ†ตํ•  ๋•Œ๋งˆ๋‹ค ๋ฐฐ์—ด์ด ์ƒˆ๋กœ ์ƒ์„ฑ. ๊ฐ ๋…ธ๋“œ์— ๋Œ€ํ•ด ๋ฐฐ์—ด์ด ๋‚˜๋‰˜๋ฏ€๋กœ O(n)์˜ ๊ณต๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง
17+
* -> ๋งŒ์•ฝ Binary Tree๊ฐ€ ํ•œ ์ชฝ์œผ๋กœ ์น˜์šฐ์ง€์ง€ ์•Š์€ Balanced Binary Tree๋ผ๋ฉด O(logn)์˜ ๊ณต๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง.
18+
*/
19+
fun buildTree(preorder: IntArray, inorder: IntArray): TreeNode? {
20+
if (preorder.isEmpty() || inorder.isEmpty()) return null
21+
22+
// ์™ผ์ชฝ ์˜ค๋ฅธ์ชฝ ๋ถ„๋ฅ˜์˜ ๊ธฐ์ค€์ด ๋˜๋Š” rootValue๋ฅผ ๊ตฌํ•˜๋Š” ๊ณผ์ •
23+
val rootValue = preorder[0]
24+
val rootNode = TreeNode(rootValue)
25+
26+
// root๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์™ผ์ชฝ, ์˜ค๋ฅธ์ชฝ subTree๋ฅผ ๊ตฌ์„ฑ
27+
val pivotValue = inorder.indexOf(rootValue)
28+
val leftInOrder = inorder.slice(0 until pivotValue)
29+
val rightInOrder = inorder.slice(pivotValue + 1 until inorder.size)
30+
31+
// ์™ผ์ชฝ, ์˜ค๋ฅธ์ชฝ subTree๋ฅผ ๊ธฐ์ค€์œผ๋กœ leftPreOrder, rightPreOrder ๊ตฌ์„ฑ
32+
val leftPreOrder = preorder.slice(1 until leftInOrder.size + 1)
33+
val rightPreOrder = preorder.slice(leftInOrder.size + 1 until preorder.size)
34+
35+
// ์žฌ๊ท€๋ฅผ ํ†ตํ•œ subTree ์ƒ์„ฑ
36+
rootNode.left = buildTree(leftPreOrder.toIntArray(), leftInOrder.toIntArray())
37+
rootNode.right = buildTree(rightPreOrder.toIntArray(), rightInOrder.toIntArray())
38+
39+
return rootNode
40+
}
41+
42+
class TreeNode(val value: Int, ) {
43+
var left: TreeNode? = null
44+
var right: TreeNode? = null
45+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package leetcode_study
2+
3+
/**
4+
* ๋ฌธ์žฅ์˜ ๋ฌธ์ž ์ˆœ์„œ๋ฅผ ๋ฐ”๊พธ์–ด ์ƒˆ๋กœ์šด ๋‹จ์–ด๋‚˜ ๋ฌธ์žฅ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š”์ง€ ํŒ๋ณ„ํ•˜๋Š” ๋ฌธ์ œ
5+
* ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n)
6+
* -> ์ฃผ์–ด์ง„ ๋ฌธ์ž์—ด์„ ์ˆœํšŒํ•˜๋ฉฐ Map ์ž๋ฃŒ๊ตฌ์กฐ์— ๊ฐ’์„ ์ฑ„์›Œ๋„ฃ๋Š” ๊ณผ์ •: O(n)
7+
* -> ์•ŒํŒŒ๋ฒณ ๋ฌธ์ž์—ด ์„ธํŒ… ๊ณผ์ •: O(1)
8+
* -> Map<์•ŒํŒŒ๋ฒณ, ๋นˆ๋„> ์ดˆ๊ธฐํ™” ๊ณผ์ •: O(1)
9+
* -> ์•ŒํŒŒ๋ฒณ ๋น„๊ต ๊ณผ์ •: O(1)
10+
* O(1) + O(1) + O(1) + O(n) => O(n)
11+
*
12+
* ๊ณต๊ฐ„ ๋ณต์žก๋„: O(1)
13+
* -> ์•ŒํŒŒ๋ฒณ ๋นˆ๋„์ˆ˜๋ฅผ ์ €์žฅ Map: O(1)
14+
*/
15+
fun isAnagram(s: String, t: String): Boolean {
16+
val alphaArray = CharArray(26) { 'a' + it}
17+
18+
if (s.length != t.length) return false
19+
20+
val sMap = alphaArray.associateWith { 0 }.toMutableMap()
21+
val tMap = alphaArray.associateWith { 0 }.toMutableMap()
22+
23+
for (i in s.indices) {
24+
sMap[s[i]] = sMap.getValue(s[i]).plus(1)
25+
tMap[t[i]] = tMap.getValue(t[i]).plus(1)
26+
}
27+
28+
for (alphabet in alphaArray) {
29+
if (sMap[alphabet] != tMap[alphabet]) {
30+
return false
31+
}
32+
}
33+
34+
return true
35+
}

0 commit comments

Comments
ย (0)