Skip to content

Commit e88c1bb

Browse files
authored
Merge branch 'DaleStudy:main' into main
2 parents 7816391 + 895165f commit e88c1bb

File tree

9 files changed

+427
-0
lines changed

9 files changed

+427
-0
lines changed

โ€Žcontains-duplicate/heypaprika.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
# Big-O ์˜ˆ์ƒ : O(n)
2+
class Solution:
3+
def containsDuplicate(self, nums: List[int]) -> bool:
4+
num_dict = {}
5+
for num in nums:
6+
if num in num_dict:
7+
return True
8+
else:
9+
num_dict[num] = 1
10+
return False
11+

โ€Žcontains-duplicate/ysle0.go

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+
}

โ€Žhouse-robber/heypaprika.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# Big-O ์˜ˆ์ƒ : O(n)
2+
class Solution:
3+
def rob(self, nums: List[int]) -> int:
4+
a = [0] * len(nums)
5+
6+
if len(nums) == 1:
7+
return nums[0]
8+
elif len(nums) == 2:
9+
return max(nums[0], nums[1])
10+
11+
a[0] = nums[0]
12+
a[1] = nums[1]
13+
a[2] = max(a[0] + nums[2], a[1])
14+
15+
for i in range(3, len(nums)):
16+
a[i] = max(a[i-3], a[i-2]) + nums[i]
17+
18+
return max(a)
19+
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# Big-O ์˜ˆ์ƒ : O(nlog(n))
2+
class Solution:
3+
def longestConsecutive(self, nums: List[int]) -> int:
4+
nums = sorted(list(set(nums)))
5+
if len(nums) == 0:
6+
return 0
7+
elif len(nums) == 1:
8+
return 1
9+
cur_long = 1
10+
longest = 1
11+
for i, num in enumerate(nums):
12+
if i == 0:
13+
continue
14+
else:
15+
if nums[i-1] + 1 == nums[i]:
16+
cur_long += 1
17+
if longest < cur_long:
18+
longest = cur_long
19+
else:
20+
cur_long = 1
21+
return longest
22+
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: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# Big-O ์˜ˆ์ƒ : O(nlog(n))
2+
import heapq
3+
class Solution:
4+
def topKFrequent(self, nums: List[int], k: int) -> List[int]:
5+
6+
num_dict = {}
7+
for num in nums:
8+
num_dict[num] = num_dict.get(num, 0) + 1
9+
heap = []
10+
for k_, v in num_dict.items():
11+
heapq.heappush(heap, [-v, k_])
12+
ans = []
13+
for i in range(k):
14+
ans.append(heapq.heappop(heap)[1])
15+
return ans
16+

โ€Žtop-k-frequent-elements/ysle0.go

Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
package top_k_frequent_elements
2+
3+
//package main
4+
5+
import (
6+
"container/heap"
7+
"slices"
8+
)
9+
10+
/*
11+
1. ๋ฌธ์ œ
12+
nums ์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ๋‚˜์˜จ ์ˆซ์ž๋“ค k ๊ฐœ๋ฅผ ๋ฐ˜ํ™˜.
13+
14+
2. ํ’€์ด
15+
map ์— ๋นˆ๋„๋ฅผ ๊ธฐ๋กํ•˜์—ฌ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌํ•œ ํ›„ k๊ฐœ ๋ฝ‘๊ธฐ
16+
17+
3. ๋ถ„์„
18+
19+
- ์‹œ๊ฐ„ ๋ณต์žก๋„: O(N + M logM) --> O(N logN)
20+
๋นˆ๋„๋งตํ•‘์„ ์œ„ํ•œ nums ์ˆœํšŒ: O(N)
21+
์˜ค๋ฆ„์ฐจ์ˆœ์ •๋ ฌ: O(M logM)
22+
23+
- ๊ณต๊ฐ„ ๋ณต์žก๋„: O(N)
24+
์ฃผ์–ด์ง„ ๋ฐฐ์—ด nums: O(N)
25+
๋นˆ๋„๋งตํ•‘์šฉ map: O(N)
26+
*/
27+
type Kvp struct {
28+
k int
29+
v int
30+
}
31+
32+
func topKFrequent(nums []int, k int) []int {
33+
freq := map[int]int{}
34+
35+
// ๋นˆ๋„๋ฅผ ๊ธฐ๋ก
36+
for _, n := range nums {
37+
if _, ok := freq[n]; !ok {
38+
freq[n] = 1
39+
} else {
40+
freq[n]++
41+
}
42+
}
43+
44+
// map->array
45+
tmp := make([]Kvp, 0, len(freq))
46+
for key, v := range freq {
47+
tmp = append(tmp, Kvp{key, v})
48+
}
49+
50+
// ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ (time O(M logM)
51+
slices.SortFunc(tmp, func(a, b Kvp) int { return b.v - a.v })
52+
53+
// []int ๋กœ ๋ณ€ํ™˜
54+
res := make([]int, 0, len(tmp))
55+
for _, kvp := range tmp {
56+
res = append(res, kvp.k)
57+
}
58+
59+
// k ๊ฐœ ๋ฝ‘๊ธฐ
60+
return res[:k]
61+
}
62+
63+
func topKElements_HeapBasedApproach(nums []int, k int) []int {
64+
freq := map[int]int{}
65+
for _, n := range nums {
66+
freq[n]++
67+
}
68+
69+
h := &IntHeap{}
70+
heap.Init(h)
71+
72+
for k, v := range freq {
73+
heap.Push(h, Kvp{k, v})
74+
if h.Len() > k {
75+
heap.Pop(h)
76+
}
77+
}
78+
79+
res := make([]int, k)
80+
for i := k - 1; i >= 0; i-- {
81+
res[i] = heap.Pop(h).(Kvp).k
82+
}
83+
84+
return res
85+
}
86+
87+
type IntHeap []Kvp
88+
89+
func (h *IntHeap) Len() int { return len(*h) }
90+
func (h *IntHeap) Less(i, j int) bool { return (*h)[i].v < (*h)[j].v }
91+
func (h *IntHeap) Swap(i, j int) { (*h)[i], (*h)[j] = (*h)[j], (*h)[i] }
92+
func (h *IntHeap) Push(x interface{}) { *h = append(*h, x.(Kvp)) }
93+
func (h *IntHeap) Pop() interface{} {
94+
old := *h
95+
n := len(old)
96+
x := old[n-1]
97+
*h = old[0 : n-1]
98+
return x
99+
}
100+
101+
func topKFrequentElements_BucketSort(nums []int, k int) []int {
102+
freq := map[int]int{}
103+
for _, n := range nums {
104+
freq[n]++
105+
}
106+
107+
buc := make([][]int, len(nums)+1)
108+
for k, v := range freq {
109+
buc[v] = append(buc[v], k)
110+
}
111+
112+
res := []int{}
113+
for i := len(buc) - 1; i >= 0 && len(res) < k; i-- {
114+
res = append(res, buc[i]...)
115+
}
116+
117+
return res[:k]
118+
}
119+
120+
//
121+
//func main() {
122+
// r1 := topKFrequent([]int{1, 1, 1, 2, 2, 3}, 2)
123+
// fmt.Println(r1)
124+
//
125+
// r2 := topKFrequent([]int{1}, 1)
126+
// fmt.Println(r2)
127+
//}

โ€Žvalid-palindrome/heypaprika.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# Big-O ์˜ˆ์ƒ : O(n)
2+
class Solution:
3+
def isPalindrome(self, s: str) -> bool:
4+
s = "".join(s.lower().split(" "))
5+
new_s = ""
6+
for item in s:
7+
if (ord("a") <= ord(item) <= ord("z")) or (ord("0") <= ord(item) <= ord("9")):
8+
new_s += item
9+
output = True
10+
new_s_2 = new_s[::-1]
11+
return new_s_2 == new_s
12+
return output
13+

0 commit comments

Comments
ย (0)