Skip to content

Commit 6690735

Browse files
Merge pull request DaleStudy#636 from EcoFriendlyAppleSu/main
[์นœํ™˜๊ฒฝ์‚ฌ๊ณผ] Week 1
2 parents f9dc342 + 100b8bb commit 6690735

File tree

5 files changed

+195
-0
lines changed

5 files changed

+195
-0
lines changed
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package leetcode_study
2+
3+
/**
4+
* Set ์ž๋ฃŒ ๊ตฌ์กฐ๋กœ ๋ณ€๊ฒฝ ํ›„ ์›์†Œ์˜ ๊ฐœ์ˆ˜๋ฅผ ๋น„๊ตํ•ด ๋ฌธ์ œ ํ•ด๊ฒฐ
5+
* ์‹œ๊ฐ„ ๋ณต์žก๋„ : O(n)
6+
* -> ๋ชจ๋“  Array์˜ ์›์†Œ๋ฅผ ์ˆœํšŒํ•ด์•ผํ•จ.
7+
* ๊ณต๊ฐ„ ๋ณต์žก๋„ : O(n)
8+
* -> IntArray์˜ ์š”์†Œ ๊ฐœ์ˆ˜์— ๋น„๋ก€ํ•˜์—ฌ ์ถ”๊ฐ€์ ์ธ ๊ณต๊ฐ„์ด ํ•„์š”ํ•จ.
9+
*/
10+
fun containsDuplicate(nums: IntArray): Boolean {
11+
val changeSet = nums.toSet()
12+
return changeSet.size != nums.size
13+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package leetcode_study
2+
3+
/**
4+
* DP๋ฅผ ์‚ฌ์šฉํ•œ ๋ฌธ์ œ ํ’€์ด.
5+
* DP๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜์—ฌ ์ตœ๋Œ€ ๊ฐ’์„ ๊ตฌํ•˜๋ ค๋ฉด 100!์— ํ•ด๋‹นํ•˜๋Š” ์—ฐ์‚ฐ์ด ํ•„์š”ํ•˜๋ฉฐ, ์ด๋Š” ์‹œ๊ฐ„ ์ดˆ๊ณผ๋ฅผ ์ดˆ๋ž˜ํ•ฉ๋‹ˆ๋‹ค.
6+
* ์‹œ๊ฐ„ ๋ณต์žก๋„ : O(n)
7+
* -> ์ฃผ์–ด์ง„ ์ˆซ์ž ๋ฐฐ์—ด ๋งŒํผ ๋ฐ˜๋ณต ์ง„ํ–‰
8+
* ๊ณต๊ฐ„ ๋ณต์žก๋„ : O(n)
9+
* -> ์ˆซ์ž ๋ฐฐ์—ด๋งŒํผ์˜ ๊ฐ€์ค‘์น˜๋ฅผ ๋‹ด์„ ๋ฐฐ์—ด ํ•„์š”
10+
*/
11+
fun rob(nums: IntArray): Int {
12+
val dp = IntArray(nums.size)
13+
14+
if (nums.size == 1) {
15+
return nums[0]
16+
}
17+
18+
if (nums.size == 2) {
19+
return max(nums[0], nums[1])
20+
}
21+
22+
dp[0] = nums[0]
23+
dp[1] = nums[1]
24+
dp[2] = nums[2] + dp[0]
25+
26+
for (i in 3 until nums.size) {
27+
dp[i] = max(dp[i-3], dp[i-2]) + nums[i]
28+
}
29+
return dp.max()
30+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package leetcode_study
2+
3+
/**
4+
* HashSet์„ ์‚ฌ์šฉํ•œ ํ’€์ด.
5+
* ์‹œ๊ฐ„ ๋ณต์žก๋„ O(n)
6+
* -> Loop๋ฅผ ๋‘ ๋ฒˆ ๋Œ๊ธฐ ๋•Œ๋ฌธ์— O(n^2)์ด๋ผ๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์œผ๋‚˜ ์ตœ์•…์˜ ์ƒํ™ฉ์ด์—ฌ๋„ O(n + (n-1))๋กœ O(n)์ด ๋จ.
7+
* -> 1 ๋ถ€ํ„ฐ 10์–ต๊นŒ์ง€์˜ ์—ฐ์†๋œ ์ˆ˜๊ฐ€ Set ์ž๋ฃŒ๊ตฌ์กฐ์— ๋‹ด๊ฒจ ์žˆ๊ณ  ์ตœ์•…์˜ ์ƒํ™ฉ์œผ๋กœ 1์ด ๋งˆ์ง€๋ง‰ ์ˆœ๋ฒˆ์— ๋ฝ‘ํžŒ๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ์„ ๋•Œ, (Set์€ ์ˆœ์„œ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์Œ)
8+
* -> 1 ๋ถ€ํ„ฐ Longest Count ํ•˜๋”๋ผ๋„ ์ฃผ์–ด์ง„ nums์—์„œ n ๋ฒˆ set์—์„œ 10์–ต -1๋ฒˆ์„ ์ˆœํšŒํ•˜๋ฏ€๋กœ O(n^2)์ด ์•„๋‹Œ O(n)์ด ๋จ.
9+
*/
10+
fun longestConsecutive(nums: IntArray): Int {
11+
val numSet: HashSet<Int> = nums.toHashSet()
12+
var longest = 0
13+
14+
for (num in nums) {
15+
// ํ˜„์žฌ ์š”์†Œ๋ณด๋‹ค ํฌ๊ธฐ๊ฐ€ 1 ์ž‘์€ ์ˆซ์ž๋ฅผ ๊ฐ–๊ณ  ์žˆ๋‹ค๋ฉด ํ˜„์žฌ ์š”์†Œ๋Š” ์ตœ์†Œ๊ฐ’์ด ์•„๋‹ˆ๋ฏ€๋กœ ๋‹ค์Œ์œผ๋กœ ๋„˜์–ด๊ฐ
16+
if (numSet.contains(num -1)) {
17+
continue
18+
}
19+
// ํ˜„์žฌ ์š”์†Œ๋ณด๋‹ค 1 ์ž‘์€ ์—ฐ์†๋œ ์ˆซ์ž๊ฐ€ ์—†์œผ๋ฏ€๋กœ ํ˜„์žฌ ์›์†Œ๋ฅผ 1 ์นด์šดํŠธ ํ•œ length ํ• ๋‹น
20+
var length = 1
21+
while (numSet.contains(num + length)) {
22+
length++
23+
}
24+
longest = max(longest, length)
25+
}
26+
return longest
27+
}
28+
29+
/**
30+
* Time Limit ๋ฐœ์ƒ.
31+
* ์‹œ๊ฐ„ ๋ณต์žก๋„ O(n^2)
32+
* -> nums ์•ˆ์— ์กด์žฌํ•˜๋Š” ์š”์†Œ๋งˆ๋‹ค ์ค‘๋ณต์„ ํฌํ•จํ•œ Loop(while) ์ง„ํ–‰
33+
*/
34+
fun longestConsecutive01(nums: IntArray): Int {
35+
// ๊ฒฐ๊ณผ๋ฅผ ๋‹ด์„ ๋ฆฌ์ŠคํŠธ
36+
val resultList = mutableListOf<Int>()
37+
38+
// 1์ฐจ loop
39+
for (i in nums.indices) {
40+
var tempResult = 0
41+
var currentNum = nums[i]
42+
// 2์ฐจ loop
43+
while (true) {
44+
if (nums.contains(currentNum)) {
45+
tempResult += 1
46+
currentNum += 1
47+
} else {
48+
break
49+
}
50+
}
51+
resultList.add(tempResult)
52+
}
53+
if (resultList.isEmpty()) {
54+
return 0
55+
}
56+
return resultList.max()
57+
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package leetcode_study
2+
3+
/**
4+
* ์ฃผ์–ด์ง„ ์ˆซ์ž๋“ค์—์„œ ๋นˆ๋„ ์ˆ˜๊ฐ€ ๊ฐ€์žฅ ํฐ k ๊ฐœ์˜ ์ˆซ์ž๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ. map ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•ด ํ•ด๊ฒฐ
5+
* ์‹œ๊ฐ„ ๋ณต์žก๋„ : O(nlogn)
6+
* -> Int Array๋ฅผ ์ˆœํšŒํ•ด map์— ๋‹ด๋Š” ๊ณผ์ • O(n)
7+
* -> ์ฑ„์›Œ์ง„ Map ์ž๋ฃŒ๊ตฌ์กฐ์—์„œ value ๊ธฐ์ค€ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ ๊ณผ์ • O(nlogn)
8+
* -> ์ •๋ ฌ๋œ Map์—์„œ K ๋งŒํผ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ณผ์ • O(K). (k๋Š” ์ƒ์ˆ˜)
9+
* ๊ฐ ๋‹จ๊ณ„์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๋”ํ•˜๋ฉด : O(n) + O(nlogn) + O(k) -> O(nlogn)
10+
* ๊ณต๊ฐ„ ๋ณต์žก๋„ : O(n)
11+
* -> Int Array์— ์กด์žฌํ•˜๋Š” ์œ ๋‹ˆํฌํ•œ ์š”์†Œ ๋งŒํผ ํ•„์š”ํ•จ.
12+
*/
13+
fun topKFrequent(nums: IntArray, k: Int): IntArray {
14+
val map = mutableMapOf<Int, Int>()
15+
16+
for (i in nums.indices) {
17+
if (map.containsKey(nums[i])) {
18+
val value = map[nums[i]]!!
19+
map[nums[i]] = value + 1
20+
} else {
21+
map.putIfAbsent(nums[i], 1)
22+
}
23+
}
24+
val sortedMap = map.toList().sortedByDescending { it.second }.toMap()
25+
return sortedMap.entries.take(k).map { it.key }.toIntArray()
26+
}
27+
28+
/**
29+
* ์ฃผ์–ด์ง„ ์ˆ˜์˜ ๋นˆ๋„์ˆ˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ˆซ์ž๋ฅผ ํ• ๋‹นํ•˜๊ณ  ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ˆœํšŒํ•ด k ๊ฐœ์˜ ์ˆซ์ž๋ฅผ ์–ป๊ฒŒ ๋˜๋ฉด ๋‹ต์„ ๋„์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•
30+
* ์‹œ๊ฐ„ ๋ณต์žก๋„ : O(n)
31+
* -> Int Array๋ฅผ ์ˆœํšŒํ•ด map์— ๋‹ด๋Š” ๊ณผ์ • O(n)
32+
* -> ๋นˆ๋„์ˆ˜ ๋ฐฐ์—ด์— ๊ฐ’์„ ์ฑ„์šฐ๋Š” ๊ณผ์ • O(n)
33+
* -> ๋นˆ๋„์ˆ˜ ๋ฐฐ์—ด์„ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ˆœํšŒํ•ด k ๊ฐœ๋ฅผ ๋งŒ์กฑํ•˜๋ฉด ๋‹ต์„ ๋„์ถœํ•˜๋Š” ๊ณผ์ • O(n).
34+
* ์ด์ค‘ for loop ์ด์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ๋นˆ๋„์ˆ˜๊ฐ€ ์œ ์ผํ•œ ์ˆซ์ž๋“ค๋งŒ ๊ณ ๋ ค๋˜๋ฏ€๋กœ k๊ฐ€ n๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” O(n)์œผ๋กœ ๊ฐ€๋Š ํ•  ์ˆ˜ ์žˆ์Œ.
35+
* ๊ฐ ๋‹จ๊ณ„์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๋”ํ•˜๋ฉด : O(n) + O(n) + O(n) -> O(n)
36+
* ๊ณต๊ฐ„ ๋ณต์žก๋„ : O(n)
37+
* -> Int Array์— ์กด์žฌํ•˜๋Š” ์œ ๋‹ˆํฌํ•œ ์š”์†Œ ๋งŒํผ ํ•„์š”ํ•จ.
38+
*/
39+
fun topKFrequent01(nums: IntArray, k: Int): IntArray {
40+
val map = mutableMapOf<Int, Int>()
41+
for(num in nums) {
42+
map[num] = map.getOrDefault(num, 0) + 1
43+
}
44+
45+
// count List ์ดˆ๊ธฐํ™”
46+
// map์˜ value๋Š” nums Size๋ฅผ ๋„˜์„ ์ˆ˜ ์—†์Œ.
47+
val countList = Array(nums.size + 1) { mutableListOf<Int>() }
48+
for ((key, value) in map) {
49+
countList[value].add(key)
50+
}
51+
52+
val result = mutableListOf<Int>()
53+
for (i in countList.size - 1 downTo 0) {
54+
for (num in countList[i]) {
55+
result.add(num)
56+
if (result.size == k) {
57+
return result.toIntArray()
58+
}
59+
}
60+
}
61+
return result.toIntArray()
62+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package leetcode_study
2+
3+
/**
4+
* ๋ฌธ์ž์—ด์˜ ๋Œ€์นญ ํŒ๋‹จ
5+
* ์‹œ๊ฐ„ ๋ณต์žก๋„ : O(n)
6+
* -> ์ฃผ์–ด์ง„(n) ํฌ๊ธฐ์˜ ๋ฌธ์ž์—ด์„ ์ˆœํšŒํ•˜๋ฉฐ ๋น„๊ตํ•จ
7+
*/
8+
fun isPalindrome(s: String): Boolean {
9+
10+
// ์ฃผ์–ด์ง„ ๋ฌธ์ž์—ด์—์„œ ๋ชจ๋“  non-alphanumeric characters๋ฅผ ํ•„ํ„ฐํ•œ ๋ฌธ์ž ๋ฐฐ์—ด ํ• ๋‹น
11+
val splitGivenString = s.toCharArray()
12+
.filter { it.isLetterOrDigit() }
13+
.map { it.lowercaseChar() }
14+
.toCharArray()
15+
16+
// ํ•„ํ„ฐ๋œ ๋ฌธ์ž์—ด์ด ๋น„์–ด์žˆ๋‹ค๋ฉด true ๋ฐ˜ํ™˜
17+
if (splitGivenString.isEmpty()) { return true }
18+
19+
// ๋Œ€์นญ์„ ๋น„๊ตํ•˜๊ธฐ ์œ„ํ•œ ์‹œ์ž‘, ๋ ๋ณ€์ˆ˜
20+
var start = 0
21+
var end = splitGivenString.size - 1
22+
23+
// ๋ฐ˜๋ณต์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋ฉฐ ๊ฐ™๋‹ค๋ฉด ์‹œ์ž‘ +1, ๋ -1 ์„ ์ง„ํ–‰ํ•ด ๋Œ€์นญ ํŒ๋‹จ
24+
while (start <= end) {
25+
if (splitGivenString[start] == splitGivenString[end]) {
26+
start += 1
27+
end -= 1
28+
continue
29+
}
30+
return false
31+
}
32+
return true
33+
}

0 commit comments

Comments
ย (0)