Skip to content

Commit f909bb4

Browse files
authored
Merge branch 'DaleStudy:main' into main
2 parents 892a279 + 6e112ea commit f909bb4

File tree

9 files changed

+541
-0
lines changed

9 files changed

+541
-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: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package contains_duplicate
2+
3+
import "sort"
4+
5+
/*
6+
1. ๋ฌธ์ œ
7+
8+
์ฃผ์–ด์ง„ int ๋ฐฐ์—ด nums์— ์ˆซ์ž๊ฐ€ ์ค‘๋ณต๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ํ•œ ๋ฒˆ์ด๋ผ๋„ ์žˆ์œผ๋ฉด true, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด false ๋ฅผ ๋ฆฌํ„ด
9+
10+
2. ํ’€์ด
11+
12+
๊ณ ์œ ๊ฐ’๋งŒ ์ €์žฅํ•˜๋Š” set(go ์—์„œ๋Š” map)์˜ ์„ฑ์งˆ์„ ํ™œ์šฉํ•˜์—ฌ
13+
nums๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ set์— ๊ฐ’์ด ์žˆ๋Š”์ง€ ์—†๋Š”์ง€ ์ฒดํฌํ•˜์—ฌ
14+
์ˆซ์ž๊ฐ€ ์ค‘๋ณต๋˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์ฒดํฌ
15+
16+
3. ๋ถ„์„
17+
- ์‹œ๊ฐ„ ๋ณต์žก๋„: O(N)
18+
nums ํƒ์ƒ‰: O(N)
19+
๋ฐฐ์—ด nums์˜ ๋ชจ๋“  ์›์†Œ๋ฅผ ๋‹จ ํ•œ ๋ฒˆ ์ˆœํšŒ
20+
map ์‚ฝ์ž…, ํƒ์ƒ‰: O(1)
21+
map์˜ ๋‚ด๋ถ€ ๊ตฌํ˜„์€ ํ•ด์‹œ ํ…Œ์ด๋ธ”.
22+
O(N)๋ณด๋‹ค ์ž‘์•„ ๋ฌด์‹œ๋จ
23+
- ๊ณต๊ฐ„ ๋ณต์žก๋„: O(N)
24+
์ตœ์•…์˜ ๊ฒฝ์šฐ๋ผ๋„ ์‚ฌ์šฉ๊ณต๊ฐ„์€ nums ์˜ ํฌ๊ธฐ๋งŒํผ + nums์˜ ๋ชจ๋“  ์›์†Œ๋ฅผ ํฌํ•จํ•œ map
25+
*/
26+
func containsDuplicate(nums []int) bool {
27+
seen := map[int]int{}
28+
29+
for _, n := range nums {
30+
if _, ok := seen[n]; ok {
31+
return true
32+
}
33+
34+
seen[n] = 1
35+
}
36+
37+
return false
38+
}
39+
40+
func containsDuplicate_SortedApproach(nums []int) bool {
41+
// early exit for small slices
42+
if len(nums) < 2 {
43+
return false
44+
}
45+
46+
// sort in ascending order and check adjacent elements
47+
sort.Ints(nums)
48+
for i := 1; i < len(nums); i++ {
49+
if nums[i] == nums[i-1] {
50+
return true
51+
}
52+
}
53+
54+
return false
55+
}
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: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package longest_consecutive_sequence
2+
3+
import "slices"
4+
5+
/*
6+
1. ๋ฌธ์ œ
7+
์ฃผ์–ด์ง„ int ๋ฐฐ์—ด nums์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ๊ธด ์—ฐ์†๋œ ์›์†Œ์˜ ๊ธธ์ด ๊ตฌํ•˜๊ธฐ
8+
9+
2. ํ’€์ด
10+
๋ชจ๋“  ์ˆ˜์˜ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๊ณ , ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜์—ฌ ์—ฐ์†๋œ ์›์†Œ์˜ ๋ถ€๋ถ„์„ ์ฐพ๊ธฐ ์œ„ํ•ด์„œ
11+
๋ฐฐ์—ด์„ ์ˆœํšŒํ•˜์—ฌ ์ธ๋ฑ์Šค ๊ณ ์ •~์ „์ง„ํ•˜๋ฉฐ ๋‹ค์Œ ์›์†Œ๊ฐ€ ์—ฐ์†๋œ ์›์†Œ์ธ์ง€ ์ฒดํฌ๋ฅผ ๋ฐ˜๋ณต
12+
13+
3. ๋ถ„์„
14+
15+
- ์‹œ๊ฐ„ ๋ณต์žก๋„: O(N logN)
16+
๋ฐฐ์—ด ์ •๋ ฌ O(N logN)
17+
์ค‘๋ณต๋œ ์›์†Œ๋ฅผ ์ œ๊ฑฐํ•ด์ฃผ๋Š” slices.Compact(nums): O(N)
18+
2์ค‘ ํฌ๋ฌธ์€ for ๋ฌธ ์ˆœํšŒ index ๋ฅผ ๊ฐ™์ด ์“ฐ๋ฏ€๋กœ O(N)
19+
20+
- ๊ณต๊ฐ„ ๋ณต์žก๋„: O(N)
21+
*/
22+
func longestConsecutive(nums []int) int {
23+
if len(nums) == 0 {
24+
return 0
25+
}
26+
27+
if len(nums) == 1 {
28+
return 1
29+
}
30+
31+
slices.Sort(nums)
32+
nums = slices.Compact(nums)
33+
// ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๊ณ  ๋‚˜์„œ๋„ 1๊ฐœ๋ฉด ์ตœ์žฅ์—ฐ์†์ˆ˜๋Š” 1
34+
if len(nums) == 1 {
35+
return 1
36+
}
37+
38+
cons := map[int]int{}
39+
cursor := 0
40+
for cursor < len(nums)-1 {
41+
cons[cursor] = 1
42+
wasConsecutive := false
43+
44+
// cursor ๋Š” ๊ณ ์ •ํ•˜๊ณ , innerCursor ๋ฅผ ๋Œ๋ฆผ
45+
innerCursor := cursor
46+
for innerCursor+1 < len(nums) &&
47+
nums[innerCursor]+1 == nums[innerCursor+1] {
48+
49+
cons[cursor]++
50+
innerCursor++
51+
wasConsecutive = true
52+
}
53+
54+
if wasConsecutive {
55+
cursor = innerCursor
56+
}
57+
cursor++
58+
}
59+
60+
//tmp := make([]int, 0, len(cons))
61+
tmp := make([]int, 0, len(cons))
62+
for _, v := range cons {
63+
tmp = append(tmp, v)
64+
}
65+
66+
slices.SortFunc(
67+
tmp,
68+
func(a, b int) int {
69+
return b - a
70+
})
71+
return tmp[0]
72+
}
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+
}

0 commit comments

Comments
ย (0)