Skip to content

Commit 0ce8e58

Browse files
authored
Merge pull request DaleStudy#122 from Invidam/week06-invidam
[Invidam] Week 06 Solutions
2 parents 16d9ab3 + eced134 commit 0ce8e58

File tree

5 files changed

+308
-0
lines changed

5 files changed

+308
-0
lines changed
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
# Intuition
2+
๋†’์ด๊ฐ€ ์–‘ ๋ ๋ผ์ธ์— ์˜ํ•ด ๊ฒฐ์ •๋œ๋‹ค๋Š” ๊ฒƒ์„ ์‘์šฉํ•˜์—ฌ ํˆฌํฌ์ธํ„ฐ ํ•ด๊ฒฐ๋ฒ•์„ ๊ณ ์•ˆํ–ˆ๋‹ค.
3+
4+
# Approach
5+
1. ๋†’์ด(`h`)๋ฅผ 0 ~ ์ตœ๋Œ€๊นŒ์ง€ ์ˆœํšŒํ•œ๋‹ค.
6+
2. ๋†’์ด๋ฅผ ์ดˆ๊ณผํ•˜๋Š” ์„ ๊นŒ์ง€ ์–‘ ๋(`l`, `r`)์„ ์กฐ์ ˆํ•œ๋‹ค.
7+
3. ์กฐ์ ˆํ•œ ์–‘ ๋์„ ์ตœ๋Œ“๊ฐ’ ๊ฐฑ์‹ ์— ์ด์šฉํ•œ๋‹ค.
8+
9+
# Complexity
10+
- Time complexity: $O(n)$
11+
- ๋ฐฐ์—ด์˜ ํฌ๊ธฐ `n`์— ๋Œ€ํ•˜์—ฌ, ๋ฐ˜๋ณต๋ฌธ์ด ๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค๋ฅผ ๋ชจ๋‘ ์ˆœํšŒํ•˜๋ฉด ์ข…๋ฃŒ๋˜๊ธฐ์— (`l < r`์ด ๊นจ์งˆ ๋•Œ) ์ด์— ๋”ฐ๋ผ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ๊ฒฐ์ •๋œ๋‹ค.
12+
- Space complexity: $O(n), inline$
13+
- ๋ฐฐ์—ด์˜ ํฌ๊ธฐ `n`์— ๋Œ€ํ•˜์—ฌ, ์ž…๋ ฅ๊ฐ’์œผ๋กœ ๋ฐฐ์—ด์„ ๋ฐ›์œผ๋‹ˆ inline์ธ n์ด ์†Œ์š”๋œ๋‹ค.
14+
15+
# Code
16+
## Two Pointer
17+
```go
18+
func maxArea(height []int) int {
19+
l, r := 0, len(height)-1
20+
var maxArea int
21+
for l < r {
22+
minH := min(height[l], height[r])
23+
maxArea = max(minH*(r-l), maxArea)
24+
25+
if minH == height[l] {
26+
l++
27+
} else {
28+
r--
29+
}
30+
}
31+
32+
return maxArea
33+
}
34+
35+
```
36+
: ์›๋ž˜๋Š” deque๋ฅผ ์ด์šฉํ•ด ํ•ด๊ฒฐํ–ˆ๋Š”๋ฐ, ์†”๋ฃจ์…˜์˜ ํˆฌํฌ์ธํ„ฐ๋ฅผ ์ด์šฉํ•œ ๊ฒƒ๊ณผ ๋™์ผํ•œ ๋ฐฉ์‹์ด์–ด์„œ ๊น”๋”ํ•œ ํ›„์ž๋กœ ์ˆ˜์ •ํ–ˆ๋‹ค.
37+
38+
## Deque
39+
```go
40+
type Deque struct {
41+
Nodes []int
42+
}
43+
44+
func NewDeque(arr []int) Deque {
45+
return Deque{Nodes: arr}
46+
}
47+
48+
func (dq *Deque) PushFront(node int) {
49+
dq.Nodes = append([]int{node}, dq.Nodes...)
50+
}
51+
52+
func (dq *Deque) PushBack(node int) {
53+
dq.Nodes = append(dq.Nodes, node)
54+
}
55+
func (dq *Deque) Front() int {
56+
return dq.Nodes[0]
57+
}
58+
59+
func (dq *Deque) Back() int {
60+
return dq.Nodes[len(dq.Nodes)-1]
61+
}
62+
63+
func (dq *Deque) PopFront() int {
64+
ret := dq.Front()
65+
66+
dq.Nodes = dq.Nodes[1:]
67+
68+
return ret
69+
}
70+
71+
func (dq *Deque) PopBack() int {
72+
ret := dq.Back()
73+
74+
dq.Nodes = dq.Nodes[0 : len(dq.Nodes)-1]
75+
76+
return ret
77+
}
78+
79+
func (dq *Deque) Size() int {
80+
return len(dq.Nodes)
81+
}
82+
83+
func maxArea(height []int) int {
84+
dq := NewDeque(height)
85+
86+
var max int
87+
for h := 0; dq.Size() > 1; h++ {
88+
for dq.Size() != 0 && dq.Front() < h {
89+
dq.PopFront()
90+
}
91+
for dq.Size() != 0 && dq.Back() < h {
92+
dq.PopBack()
93+
}
94+
95+
area := h * (dq.Size() - 1)
96+
97+
if area > max {
98+
max = area
99+
}
100+
}
101+
102+
return max
103+
}
104+
105+
```
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
# Intuition
2+
์ „ํ˜•์ ์ธ ์ด๋ถ„ํƒ์ƒ‰ ๋ฌธ์ œ์˜€๋‹ค.
3+
4+
# Approach
5+
1. `nums[0]๋ณด๋‹ค ์ž‘์€์ง€ ์—ฌ๋ถ€`๋ฅผ ๊ฒ€์‚ฌํ•˜๋„๋ก ์„ค๊ณ„ํ–ˆ๋‹ค.
6+
2. `lo`๋Š” ํ•ญ์ƒ F์ด๋ฉฐ, `hi`๋Š” ํ•ญ์ƒ T์ด๋‹ค.
7+
2. ๋ฐฐ์—ด์˜ ์›์†Œ๋“ค์— ๋Œ€ํ•ด FFFFFFFTTTTTT๊ฐ€ ๋˜๋Š”๋ฐ, ์ด ๋•Œ `T`๊ฐ€ ์ฒ˜์Œ ๋“ฑ์žฅํ•˜๋Š” ์ง€์ ์„ ์ฐพ๋Š”๋‹ค.
8+
3. ๋“ฑ์žฅํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ (`nums[0]`์ด ์ตœ์†Œ์ธ ๊ฒฝ์šฐ = ํšŒ์ „์ด ์—†๋Š” ๊ฒฝ์šฐ)๋Š” hi๊ฐ€ ๋ฐฐ์—ด ๋ฒ”์œ„ ๋ฐ–์ด๋ฏ€๋กœ, ์ธ๋ฑ์Šค 0์„ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ํ–ˆ๋‹ค.
9+
10+
(๋ฌธ์ œ ํ•ด๊ฒฐ ์ดํ›„ ํƒ€ ๋ฌธ์ œ ์žฌํ™œ์šฉ์„ ์œ„ํ•ด ์ธ๋ฑ์Šค๋ฅผ ์ฐพ๋„๋ก ๋ฆฌํŒฉํ„ฐ๋งํ–ˆ๋‹ค.)
11+
# Complexity
12+
- Time complexity: $O(log(n))$
13+
- ๋ฐฐ์—ด์˜ ๊ธธ์ด `n`์— ๋Œ€ํ•˜์—ฌ, ๋ฒ”์œ„๋ฅผ ๋ฐ˜์œผ๋กœ ์ค„์—ฌ๊ฐ€๋ฉฐ ์ด๋ถ„ ํƒ์ƒ‰ํ•˜๋ฏ€๋กœ `log(n)`์ด ๋ฐœ์ƒํ•œ๋‹ค.
14+
15+
- Space complexity: $O(n), inline$
16+
- ๋ฐฐ์—ด์˜ ๊ธธ์ด `n`์— ๋Œ€ํ•˜์—ฌ, ์ž…๋ ฅ(`nums`)์˜ ๋น„์šฉ์ด ์กด์žฌํ•œ๋‹ค.
17+
18+
# Code
19+
```go
20+
func findMinIdx(nums []int) int {
21+
lo, hi := -1, len(nums)
22+
for lo+1 < hi {
23+
mid := (lo + hi) / 2
24+
25+
if nums[mid] < nums[0] {
26+
hi = mid
27+
} else {
28+
lo = mid
29+
}
30+
}
31+
if hi == len(nums) {
32+
return 0
33+
}
34+
return hi
35+
}
36+
37+
func findMin(nums []int) int {
38+
return nums[findMinIdx(nums)]
39+
}
40+
41+
```
42+
43+
# ์—ฌ๋‹ด
44+
์ด๋ถ„ํƒ์ƒ‰ ๋ฌธ์ œ๋Š” ํƒ€ ์†”๋ฃจ์…˜์„ ์ฐธ๊ณ ํ•˜์ง€ ์•Š๋Š” ํŽธ์ด๋‹ค. ์™œ๋ƒํ•˜๋ฉด `lo`, `hi`, ์ข…๋ฃŒ ์กฐ๊ฑด, ๋ฐ˜ํ™˜ ๊ฐ’ ์„ค์ •์ด ๋น„์Šทํ•ด๋ณด์ด์ง€๋งŒ ์—„์ฒญ ๋‹ค๋ฅธ ์˜๋ฏธ์ด๊ธฐ์— ํฐ ๋„์›€์ด ์•ˆ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
# Intuition
2+
๋ฌธ์ž์—ด ๋‚ด์— ์˜๋ฌธ์ž๋“ค๋งŒ ๋“ฑ์žฅํ•œ๋‹ค๋Š” ๊ฒƒ์—์„œ DP, ๊ทธ๋ฆฌ๋””๊ฐ€ ์•„๋‹ˆ๋ผ ๋นˆ๋„์ˆ˜ ๊ณ„์‚ฐ + ํˆฌํฌ์ธํ„ฐ์ž„์„ ์•Œ๊ฒŒ๋˜์—ˆ๋‹ค.
3+
4+
# Approach
5+
1. A-Z์— ๋Œ€ํ•ด ์ˆœํšŒํ•œ๋‹ค.
6+
2. ํฌํ•จํ•˜๋Š” ๋ฐฐ์—ด์ด ์ปค์ง€๋ฉฐ(`j++`) ์ˆœํšŒํ•˜๋Š” ๋ฌธ์ž๊ฐ€ ๋ช‡ ๋ฒˆ ์—ฐ์†ํ•ด์„œ ๋“ฑ์žฅํ•˜๋Š”์ง€ ๊ณ„์‚ฐํ•œ๋‹ค. (`have`)
7+
3. ์—ฐ์†ํ•˜์ง€ ์•Š์€ ๋ฌธ์ž๊ฐ€ ๋“ฑ์žฅํ•˜๋”๋ผ๋„ `k`๋ฒˆ์€ ๋ด์ค€๋‹ค.
8+
4. `k`๋ฒˆ์ด์ƒ์ด๋ผ ๋ด์ค„ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ (`have+k < j-i+1`์ธ ๊ฒฝ์šฐ) ํฌํ•จํ•˜๋Š” ๋ฐฐ์—ด์„ ์ค„์ธ๋‹ค. (`i++`)
9+
10+
# Complexity
11+
- Time complexity: $O(n)$
12+
- ์ˆœํšŒํ•˜๋Š” ๋ฌธ์ž๋“ค์€ ์ƒ์ˆ˜ ๊ฐœ์ˆ˜(26)์ด๋ฏ€๋กœ ๋ฌด์‹œํ•œ๋‹ค.
13+
- ๋ฌธ์ž์—ด์˜ ๊ธธ์ด `n`์— ๋Œ€ํ•˜์—ฌ, ์ด๋ฅผ ์ˆœํšŒํ•˜๋Š” ๋น„์šฉ์ด ๋“ ๋‹ค. (`j<len(s)`)
14+
15+
- Space complexity: $O(n) inline$
16+
- ๋ฌธ์ž์—ด์˜ ๊ธธ์ด `n`์— ๋Œ€ํ•˜์—ฌ, ์ž…๋ ฅ์œผ๋กœ ๋ฐ›์€ `s`๋งŒํผ ๋น„์šฉ์ด ๋“ ๋‹ค.
17+
18+
# Code
19+
```go
20+
func characterReplacement(s string, k int) int {
21+
var maxLen int
22+
for ch := 'A'; ch <= 'Z'; ch++ {
23+
i, j := 0, 0
24+
var have int
25+
for j < len(s) {
26+
if ch == rune(s[j]) {
27+
have++
28+
}
29+
for have+k < j-i+1 {
30+
if ch == rune(s[i]) {
31+
have--
32+
}
33+
i++
34+
}
35+
maxLen = max(maxLen, j-i+1)
36+
j++
37+
}
38+
}
39+
return maxLen
40+
}
41+
42+
```
43+
# ์—ฌ๋‹ด
44+
- ๊ฐ€์žฅ ๋งŽ์ด ๋“ฑ์žฅํ•œ ๋ฌธ์ž๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” ์†”๋ฃจ์…˜์„ ํ™•์ธํ–ˆ๋‹ค. ๋™์ผ ๋ฌธ์ œ๋ฅผ ๋‹ค๋ฅด๊ฒŒ ์ ‘๊ทผํ•œ๋‹ค๋Š” ๊ฒŒ ์‹ ๊ธฐํ–ˆ๋‹ค.
45+
- ๋น„๊ตํ•ด๋ณด์ž๋ฉด, A~Z์ค‘ ํ•œ ๋ฌธ์ž๊ฐ€ ๋“ฑ์žฅํ•˜๋Š” ๊ฒƒ๋งŒ ๊ณ„์‚ฐํ•œ๋‹ค๋Š” ๋ณธ์ธ์˜ ํ’€์ด๊ฐ€ ๋”์šฑ ์ง๊ด€์ ์ด๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.
46+
- ๋‹ค๋งŒ, ์ฝ”๋“œ๋กœ ๋‚˜ํƒ€๋ƒˆ์„ ๋•Œ๋Š” ๋œ ์ง๊ด€์ ์ด์—ˆ๋‹ค...;
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
# Intuition
2+
DP, ๊ทธ๋ฆฌ๋”” ๋“ฑ์„ ์‹œ๋„ํ•˜๋ ค๋‹ค๊ฐ€ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ๊ฒฌํ–ˆ๋‹ค. ํ™”์ดํŠธ๋ณด๋“œ์— ์˜ˆ์ œ ๋ฌธ์ œ๋“ค์„ ์†์œผ๋กœ ํ’€์–ด๋ณด๋‹ˆ ์ง๊ด€์ ์œผ๋กœ ๋– ์˜ฌ๋ž๋‹ค.
3+
# Approach
4+
1. ๋˜‘๊ฐ™์€ ์Œ์‹์„ ๋จน์ง€ ์•Š๋Š” ์ง€๋ ์ด๋ฅผ ์ƒ๊ฐํ•˜์ž.
5+
2. ๋‹ค์Œ ์Œ์‹์„ ์ด๋ฏธ ๋จน์—ˆ๋‹ค๋ฉด, ๋จน์—ˆ๋˜ ๊ฑธ ๋ฑ‰๋Š”๋‹ค. (`l++`)
6+
3. ๋‹ค์Œ ์Œ์‹์„ ๋จน์ง€ ์•Š์•˜๋‹ค๋ฉด, ๋จน๋Š”๋‹ค. (`r++`)
7+
4. ์ง€๋ ์ด์˜ ๊ธธ์ด๋ฅผ ์ตœ๋Œ“๊ฐ’ ๊ฐฑ์‹ ์— ํ™œ์šฉํ•œ๋‹ค.
8+
# Complexity
9+
- Time complexity: $O(n)$
10+
- ๋ฌธ์ž์—ด์˜ ๊ธธ์ด `n`์— ๋Œ€ํ•˜์—ฌ, ์ด๋ฅผ ์ˆœํšŒํ•˜๋Š” ๋น„์šฉ์ด ์†Œ๋ชจ๋œ๋‹ค.
11+
- Space complexity: $O(n)$
12+
- ๋ฌธ์ž์—ด์˜ ๊ธธ์ด `n`์— ๋Œ€ํ•˜์—ฌ, ๋“ฑ์žฅ ์—ฌ๋ถ€๋ฅผ ์ €์žฅํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ(`contains`)๋Š” ์ตœ๋Œ€ `n`๊ฐœ ๋งŒํผ์„ ์ €์žฅํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ `n`์ด๋‹ค.
13+
<!-- Add your space complexity here, e.g. $$O(n)$$ -->
14+
15+
# Code
16+
```go
17+
func lengthOfLongestSubstring(s string) int {
18+
if len(s) == 0 {
19+
return 0
20+
}
21+
contains := make(map[uint8]bool)
22+
23+
l, r := 0, 0
24+
maxLen := 1
25+
26+
for r < len(s) {
27+
for contains[s[r]] {
28+
contains[s[l]] = false
29+
l++
30+
}
31+
contains[s[r]] = true
32+
maxLen = max(maxLen, r-l+1)
33+
r++
34+
}
35+
36+
return maxLen
37+
}
38+
39+
```
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
# Intuition
2+
์ด๋ถ„ ํƒ์ƒ‰์ธ ๊ฒŒ ์ง๊ด€์ ์œผ๋กœ ๋ณด์˜€๋‹ค.
3+
4+
# Approach
5+
1. ์ฐพ์œผ๋ ค๋Š” ๊ฐ’(`target`)์ด ์ตœ์†Ÿ๊ฐ’์˜ ์ธ๋ฑ์Šค(`minIdx`) ์ด์ „/์ดํ›„์ธ์ง€ ํŒ๋‹จํ•œ๋‹ค. (`target < nums[0] || minIdx == 0`)
6+
2. ํŒ๋‹จํ•œ ๋ฒ”์œ„(์ด์ „, ์ดํ›„)์— ๋Œ€ํ•ด์„œ๋งŒ ๋ฐฐ์—ด์„ ์ž˜๋ผ `lowerBound`๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
7+
3. ๊ฒฐ๊ณผ๋ฅผ ํ†ตํ•ด ํƒ€๊ฒŸ์˜ ์ธ๋ฑ์Šค(`targetIdx`)๋ฅผ ํš๋“ํ•œ๋‹ค.
8+
4. ์˜ˆ์™ธ์ฒ˜๋ฆฌ(๋ฒ”์œ„ ๋ฒ—์–ด๋‚œ ๊ฒฝ์šฐ, `lowerBound`์€ ๋งž์œผ๋‚˜ ์ผ์น˜ํ•˜์ง„ ์•Š๋Š” ๊ฒฝ์šฐ)์—” `-`์„ ์•„๋‹Œ ๊ฒฝ์šฐ๋Š” ์ธ๋ฑ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
9+
10+
# Complexity
11+
- Time complexity: $O(log(n))$
12+
- ๋ฐฐ์—ด์˜ ๊ธธ์ด `n`์— ๋Œ€ํ•˜์—ฌ, ๋ฒ”์œ„๋ฅผ ๋ฐ˜์œผ๋กœ ์ค„์—ฌ๊ฐ€๋ฉฐ ์ด๋ถ„ ํƒ์ƒ‰ํ•˜๋ฏ€๋กœ `log(n)`์ด ๋ฐœ์ƒํ•œ๋‹ค.
13+
- ๋‘ ์ด๋ถ„ํƒ์ƒ‰ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ธด ํ•˜์ง€๋งŒ, ํ•ฉ์—ฐ์‚ฐ์ด๋ฏ€๋กœ ๋ณต์žก๋„์—๋Š” ์˜ํ–ฅ์ด ์—†๋‹ค.
14+
- Space complexity: $O(n), inline$
15+
- ๋ฐฐ์—ด์˜ ๊ธธ์ด `n`์— ๋Œ€ํ•˜์—ฌ, ์ž…๋ ฅ(`nums`)์˜ ๋น„์šฉ์ด ์กด์žฌํ•œ๋‹ค.
16+
17+
# Code
18+
```go
19+
func findMinIdx(nums []int) int {
20+
lo, hi := -1, len(nums)
21+
for lo+1 < hi {
22+
mid := (lo + hi) / 2
23+
24+
if nums[mid] < nums[0] {
25+
hi = mid
26+
} else {
27+
lo = mid
28+
}
29+
}
30+
if hi == len(nums) {
31+
return 0
32+
}
33+
return hi
34+
}
35+
36+
func lowerBound(nums []int, target int) int {
37+
lo, hi := -1, len(nums)
38+
for lo+1 < hi {
39+
mid := (lo + hi) / 2
40+
41+
if nums[mid] < target {
42+
lo = mid
43+
} else {
44+
hi = mid
45+
}
46+
}
47+
return hi
48+
}
49+
50+
func search(nums []int, target int) int {
51+
minIdx := findMinIdx(nums)
52+
var targetIdx int
53+
if target < nums[0] || minIdx == 0 {
54+
targetIdx = lowerBound(nums[minIdx:], target) + minIdx
55+
} else {
56+
targetIdx = lowerBound(nums[0:minIdx], target)
57+
}
58+
59+
if len(nums) <= targetIdx || target != nums[targetIdx] {
60+
return -1
61+
}
62+
return targetIdx
63+
64+
}
65+
66+
```
67+
# I learned
68+
`whitespace around operator`(์—ฐ์‚ฐ์ž ๊ทผ์ฒ˜์—์„œ ๊ณต๋ฐฑ ์‚ฌ์šฉ)์— ๋Œ€ํ•œ golang์˜ ํ•ด์„์ด ์ผ๋ฐ˜์ ์ธ ์–ธ์–ด๋“ค๊ณผ ๋‹ค๋ฅธ ๊ฑธ ์•Œ๊ฒŒ๋˜์—ˆ๋‹ค.
69+
- ์ผ๋ฐ˜์–ธ์–ด: `lo + 1 < hi`
70+
- GoLang: `lo+1 < hi`
71+
72+
์ฆ‰, ๋ชจ๋“  ์—ฐ์‚ฐ์ž ๊ทผ์ฒ˜์— ๊ณต๋ฐฑ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋‚ฎ์€ ์šฐ์„ ์ˆœ์œ„์˜ ์—ฐ์‚ฐ์ž์— ๋Œ€ํ•ด์„œ๋งŒ ์ถ”๊ฐ€ํ•œ๋‹ค.
73+
74+
์ฐธ๊ณ : https://news.ycombinator.com/item?id=10796427

0 commit comments

Comments
ย (0)