Skip to content

Commit a944a26

Browse files
authored
Merge pull request DaleStudy#132 from Invidam/week07-invidam
[Invidam] Week 7
2 parents 07cb561 + 5a87190 commit a944a26

File tree

5 files changed

+404
-0
lines changed

5 files changed

+404
-0
lines changed
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
# Intuition
2+
<!-- Describe your first thoughts on how to solve this problem. -->
3+
ํŠธ๋ฆฌ๋ฅผ ์ˆœํšŒํ•˜๋Š” ๋ฐฉ๋ฒ•๋“ค ์ค‘, ๋ ˆ๋ฒจ ์ˆœ์„œ๋Œ€๋กœ ์ˆœํšŒํ•˜๋Š” ๋ฐฉ์‹์„ ์•Œ๊ณ ์žˆ์–ด ์ด๋ฅผ ์ด์šฉํ–ˆ๋‹ค.
4+
# Approach
5+
1. BFS๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค.
6+
2. ์ง„ํ–‰ํ•˜๊ธฐ ์ „, ํ•ด๋‹น ๋ ˆ๋ฒจ์— ๋ช‡๊ฐœ์˜ ์›์†Œ๊ฐ€ ์žˆ๋Š”์ง€(`currLen`)์„ ์ €์žฅํ•œ๋‹ค.
7+
3. ์ €์žฅ๋œ ์›์†Œ๋งŒํผ ์ˆœํšŒํ–ˆ๋‹ค๋ฉด, ๋ ˆ๋ฒจ์„ ๋‹ค ๋‘˜๋Ÿฌ๋ณธ ๊ฒƒ์ด๋ฏ€๋กœ ๋ถ€๊ฐ€์ž‘์—…(`levels = append(levels, level)`)์„ ํ•œ๋‹ค.
8+
9+
# Complexity
10+
- Time complexity: $O(n)$
11+
- ํŠธ๋ฆฌ์˜ ์›์†Œ๋ฅผ n๊ฐœ๋ผ๊ณ  ํ–ˆ์„ ๋•Œ, ๋ชจ๋“  ์›์†Œ๋ฅผ ์ˆœํšŒํ•˜๋Š” ๋น„์šฉ `O(n)`์ด ์†Œ๋ชจ๋œ๋‹ค.
12+
- Space complexity: $O(n)$
13+
- ํŠธ๋ฆฌ์˜ ์›์†Œ๋ฅผ n๊ฐœ๋ผ๊ณ  ํ–ˆ์„ ๋•Œ, ๋ชจ๋“  ์›์†Œ๋“ค์„ ์ €์žฅํ•˜๋Š” ๋ฐฐ์—ด์ด `O(n)`์„ ์†Œ๋ชจํ•œ๋‹ค.
14+
15+
# Code
16+
```go
17+
func levelOrder(root *TreeNode) [][]int {
18+
levels := make([][]int, 0)
19+
20+
if root == nil {
21+
return levels
22+
}
23+
24+
q := []*TreeNode{root}
25+
26+
for len(q) > 0 {
27+
level := make([]int, 0)
28+
currLen := len(q)
29+
for i := 0; i < currLen; i++ {
30+
front := q[0]
31+
level = append(level, front.Val)
32+
q = q[1:]
33+
34+
if front.Left != nil {
35+
q = append(q, front.Left)
36+
}
37+
if front.Right != nil {
38+
q = append(q, front.Right)
39+
}
40+
}
41+
levels = append(levels, level)
42+
}
43+
44+
return levels
45+
}
46+
47+
```
48+
49+
```go
50+
func levelOrder(root *TreeNode) [][]int {
51+
levels := make([][]int, 0)
52+
53+
if root == nil {
54+
return levels
55+
}
56+
57+
q := []*TreeNode{root}
58+
var nextQ []*TreeNode
59+
60+
for len(q) > 0 {
61+
level := make([]int, 0)
62+
for _, front := range q {
63+
level = append(level, front.Val)
64+
65+
if front.Left != nil {
66+
nextQ = append(nextQ, front.Left)
67+
}
68+
if front.Right != nil {
69+
nextQ = append(nextQ, front.Right)
70+
}
71+
}
72+
q, nextQ = nextQ, q[:0]
73+
74+
levels = append(levels, level)
75+
}
76+
77+
return levels
78+
}
79+
80+
```
81+
- ์ฒซ ๋ฒˆ์งธ ์ฝ”๋“œ๋Š” `q[1:]`์„ ์ด์šฉํ•ด์„œ ํ์˜ `pop()`์„ ๊ตฌํ˜„ํ•œ๋‹ค. ํ•˜์ง€๋งŒ GoLang์—์„œ๋Š” `pop()`์„ ํ•œ๋‹ค๊ณ ํ•ด์„œ, ์ฐธ์กฐ๊ฐ€ ํ•ด์ œ๋˜์ง€ ์•Š์•„ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณ„์† ์žก์•„๋จน๋Š”๋‹ค.
82+
- `pop()`์„ ํ•˜๋”๋ผ๋„ `q`๊ฐ€ ์ˆœํšŒํ•˜๋Š” ๋ชจ๋“  ์›์†Œ๋“ค์„ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋‹ค.
83+
- ๋‘ ๋ฒˆ์งธ ์ฝ”๋“œ๋Š” `q, nextQ = nextQ, q[:0]`์„ ์ด์šฉํ•ด์„œ `q`์™€ `nextQ`์˜ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ๊ต์ฒดํ•  ๋ฟ, ๋ถ€๊ฐ€์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š์•„ ๋”์šฑ ํšจ์œจ์ ์ด๋‹ค.
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
# Intuition
2+
์ด์ „์— ํ’€์–ด๋ดค๋˜ ๋ฌธ์ œ์˜€๋‹ค! ์–ด๋ ค์šด ๋ฌธ์ œ์˜€๋‹ค๋Š” ์ƒ๊ฐ์„ ๋ฒ—์–ด๋˜์ง€๊ณ  ์ตœ๋Œ€ํ•œ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ’€์–ด๋ณด๋ ค๊ณ  ํ–ˆ๋‹ค.
3+
# Approach
4+
<!-- Describe your approach to solving the problem. -->
5+
1. ๋‘ ๋…ธ๋“œ(`p`, `q`) ๋ชจ๋‘ ์–ด๋– ํ•œ ๊ฒฝ๋กœ๋ฅผ ๊ฑฐ์ณ, ํ•ด๋‹น ๋…ธ๋“œ๊นŒ์ง€ ๋„์ฐฉํ•˜๋Š”์ง€ ์กฐ์ƒ๋“ค์„ ๋ฐฐ์—ด(`routes`)์— ์ €์žฅํ•œ๋‹ค.
6+
2. ๋ฐฐ์—ด์„ ํ•˜๋‚˜์”ฉ ๋น„๊ตํ•ด๊ฐ€๋ฉฐ, ๋‘ ๋…ธ๋“œ๊ฐ€ ์—‡๊ฐˆ๋ฆฌ๋Š” ์ง€์ (`pRoutes[idx] != qRoutes[idx]`)์„ ์ฐพ๋Š”๋‹ค.
7+
3. ๊ทธ ์ง€์  ๋ฐ”๋กœ ์ด์ „ ์ง€์ (`[idx-1]`)์ด ์ตœ์†Œ ๊ณตํ†ต ์กฐ์ƒ์ด๋‹ค.
8+
# Complexity
9+
- Time complexity
10+
- ํ‰๊ท : $O(log(n))$
11+
- ์ตœ์•…: $O(n)$
12+
- ํŠธ๋ฆฌ์˜ ๋†’์ด๋งŒํผ ์ˆœํšŒ๋ฅผ ํ•˜๊ฒŒ๋œ๋‹ค. ๋…ธ๋“œ๊ฐ€ n๊ฐœ ์ด๋ฏ€๋กœ, ํŠธ๋ฆฌ์˜ ๋†’์ด๋Š” ์ตœ์„  `log(n)`, ์ตœ์•… `n`์ด ๋œ๋‹ค.
13+
14+
- Space complexity
15+
- ํ‰๊ท : $O(log(n))$
16+
- ์ตœ์•…: $O(n)$
17+
- ํŠธ๋ฆฌ์˜ ๋†’์ด๋งŒํผ ์ˆœํšŒ๋ฅผ ํ•˜๊ฒŒ๋œ๋‹ค. ๋…ธ๋“œ๊ฐ€ n๊ฐœ ์ด๋ฏ€๋กœ, ํŠธ๋ฆฌ์˜ ๋†’์ด๋Š” ์ตœ์„  `log(n)`, ์ตœ์•… `n`์ด ๋œ๋‹ค.
18+
19+
# Code
20+
```go
21+
func getRoutes(head, target *TreeNode) []*TreeNode {
22+
routes := make([]*TreeNode, 0)
23+
24+
curr := head
25+
for curr.Val != target.Val {
26+
routes = append(routes, curr)
27+
if target.Val == curr.Val {
28+
break
29+
} else if target.Val < curr.Val {
30+
curr = curr.Left
31+
} else {
32+
curr = curr.Right
33+
}
34+
}
35+
return append(routes, curr)
36+
}
37+
38+
func lowestCommonAncestor(root, p, q *TreeNode) *TreeNode {
39+
pRoutes := getRoutes(root, p)
40+
qRoutes := getRoutes(root, q)
41+
42+
idx := 0
43+
for idx < min(len(pRoutes), len(qRoutes)) && pRoutes[idx] == qRoutes[idx] {
44+
idx++
45+
}
46+
47+
return pRoutes[idx-1]
48+
}
49+
50+
```
51+
# Intuition & Approach
52+
(์†”๋ฃจ์…˜์˜ ํ•ด๊ฒฐ๋ฒ• ์ฐธ๊ณ )
53+
54+
๋‘ ๋…ธ๋“œ๋Š” ๊ณตํ†ต์กฐ์ƒ๊นŒ์ง€๋Š” ๋™์ผํ•œ ๋Œ€์†Œ๊ด€๊ณ„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ฐ€, ๊ณตํ†ต ์กฐ์ƒ ์ดํ›„๋กœ ๋Œ€์†Œ๊ด€๊ณ„๊ฐ€ ๊ตฌ๋ถ„๋œ๋‹ค.
55+
๋”ฐ๋ผ์„œ, ๋ฃจํŠธ์—์„œ ๋™์ผํ•œ ๋Œ€์†Œ๊ด€๊ณ„๊ฐ€ ์žˆ๋Š” ์กฐ์ƒ๊นŒ์ง€ ์ด๋™ํ•œ๋‹ค. (๋‹ค์‹œ ๋งํ•ด, ๋Œ€์†Œ ๊ด€๊ณ„๊ฐ€ ๊ตฌ๋ถ„๋˜๋Š” ํŠน์ • ์ง€์ ์ด ๋ฐœ์ƒํ•œ๋‹ค๋ฉด ๊ทธ ์ง€์ ์˜ ๋ถ€๋ชจ๊ฐ€ ๊ณตํ†ต ์กฐ์ƒ์ด๋‹ค.)
56+
# Complexity
57+
- Time complexity
58+
- ํ‰๊ท : $O(log(n))$
59+
- ์ตœ์•…: $O(n)$
60+
- ํŠธ๋ฆฌ์˜ ๋†’์ด๋งŒํผ ์ˆœํšŒ๋ฅผ ํ•˜๊ฒŒ๋œ๋‹ค. ๋…ธ๋“œ๊ฐ€ n๊ฐœ ์ด๋ฏ€๋กœ, ํŠธ๋ฆฌ์˜ ๋†’์ด๋Š” ์ตœ์„  `log(n)`, ์ตœ์•… `n`์ด ๋œ๋‹ค.
61+
62+
- Space complexity: $O(1)$
63+
- ๋ณ„๋„ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ์˜ ์ˆœํšŒ๋งŒ์ด ์กด์žฌํ•œ๋‹ค.
64+
65+
# Code
66+
## For-loop
67+
```go
68+
func lowestCommonAncestor(root, p, q *TreeNode) *TreeNode {
69+
curr := root
70+
for {
71+
if p.Val < curr.Val && q.Val < curr.Val {
72+
curr = curr.Left
73+
} else if p.Val > curr.Val && q.Val > curr.Val {
74+
curr = curr.Right
75+
} else {
76+
break
77+
}
78+
}
79+
return curr
80+
}
81+
82+
```
83+
## Recursion
84+
```go
85+
func lowestCommonAncestor(root, p, q *TreeNode) *TreeNode {
86+
if p.Val < root.Val && q.Val < root.Val {
87+
return lowestCommonAncestor(root.Left, p, q)
88+
} else if p.Val > root.Val && q.Val > root.Val {
89+
return lowestCommonAncestor(root.Right, p, q)
90+
}
91+
return root
92+
}
93+
94+
```
95+
: ํ•จ์ˆ˜ ์ฝœ์Šคํƒ์ด ํŠธ๋ฆฌ์˜ ๋†’์ด๋งŒํผ ์ฆ๊ฐ€ํ•˜๋ฏ€๋กœ, ๊ณต๊ฐ„ ๋ณต์žก๋„๊ฐ€ O(n)๊นŒ์ง€ ์ฆ๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค. (์ฒ˜์Œ ํ•ด๊ฒฐ๋ฒ•์˜ ๊ณต๊ฐ„ ๋ณต์žก๋„์ฒ˜๋Ÿผ.)
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
# Intuition
2+
n๋ฒˆ ์งธ๋ฅผ ์•Œ๊ธฐ ์œ„ํ•ด ์ •๋ณด(๋ช‡ ๋ฒˆ์งธ์— ์–ด๋–ค ์š”์†Œ๊ฐ€ ์žˆ๋Š”์ง€)๋ฅผ ์•Œ์•„์•ผ ํ•œ๋‹ค.
3+
# Approach
4+
1. ๋ฐฐ์—ด์— ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ ์ •๋ณด๋ฅผ ๋ชจ๋‘ ๋„ฃ๋Š”๋‹ค.
5+
2. ๋งจ ์•ž ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ (`len(nodes) == n`) ํ—ค๋“œ์˜ ๋‹ค์Œ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
6+
3. ๋’ค์—์„œ `n`๋ฒˆ์งธ ์š”์†Œ(`len(nodes)-n`)์˜ ์•ž๊ณผ ๋’ค๋ฅผ ์ด์–ด๋ถ™์—ฌ `n`๋ฒˆ์งธ ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค.
7+
# Complexity
8+
- Time complexity: $O(n)$
9+
- ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ์˜ ๊ธธ์ด `n`์— ๋Œ€ํ•˜์—ฌ, ์ด๋ฅผ ์ˆœํšŒํ•˜๋Š” ๋น„์šฉ์ด ๋ฐœ์ƒํ•œ๋‹ค.
10+
- Space complexity: $O(n)$
11+
- ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ์˜ ๊ธธ์ด `n`์— ๋Œ€ํ•˜์—ฌ, ๋ฐฐ์—ด์˜ ํฌ๊ธฐ `n`์ด ๋ฐœ์ƒํ•œ๋‹ค.
12+
13+
# Code
14+
## Array
15+
```go
16+
func removeNthFromEnd(head *ListNode, n int) *ListNode {
17+
nodes := make([]*ListNode, 0, 100)
18+
19+
for curr := head; curr != nil; curr = curr.Next {
20+
nodes = append(nodes, curr)
21+
}
22+
23+
if len(nodes) == n {
24+
return head.Next
25+
}
26+
27+
nodes[len(nodes)-n-1].Next = nodes[len(nodes)-n].Next
28+
return head
29+
}
30+
31+
```
32+
# Intuition
33+
๋ฐฐ์—ด์˜ ๋ชจ๋“  ์›์†Œ๋ฅผ ์ €์žฅํ•  ํ•„์š”๋Š” ์—†์–ด ๋ณด์˜€๋‹ค. ๊ณต๊ฐ„ ๋ณต์žก๋„๋ฅผ ์ค„์ผ ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์•˜๋‹ค.
34+
# Approach
35+
๋ชจ๋“  ์›์†Œ๊ฐ€ ์•„๋‹ˆ๋ผ, `n`๋ฒˆ์งธ์˜ ์ด์ „(`prev`), ์ดํ›„ (`next`)๋งŒ์„ ์ €์žฅํ•˜๊ฒŒ ํ•˜์˜€๋‹ค.
36+
# Complexity
37+
- Time complexity: $O(n)$
38+
- ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ์˜ ๊ธธ์ด `n`์— ๋Œ€ํ•˜์—ฌ, ์ด๋ฅผ ์ˆœํšŒํ•˜๋Š” ๋น„์šฉ์ด ๋ฐœ์ƒํ•œ๋‹ค.
39+
- Space complexity: $O(1)$
40+
- 2๊ฐœ์˜ ์š”์†Œ๋งŒ ์œ ์ง€ํ•˜๋ฏ€๋กœ, `O(1)`์ด๋‹ค.
41+
42+
# Code
43+
## Two Pointer
44+
```go
45+
func removeNthFromEnd(head *ListNode, n int) *ListNode {
46+
len := 0
47+
for curr := head; curr != nil; curr = curr.Next {
48+
len++
49+
}
50+
51+
if len == n {
52+
return head.Next
53+
}
54+
55+
var prev, curr, next *ListNode
56+
curr = head
57+
next = head.Next
58+
for i := 0; i+n < len; i++ {
59+
prev = curr
60+
curr = next
61+
next = next.Next
62+
}
63+
64+
prev.Next = next
65+
return head
66+
}
67+
68+
```

โ€Žreorder-list/invidam.go.md

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
# Intuition
2+
<!-- Describe your first thoughts on how to solve this problem. -->
3+
์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•œ ํ’€์ด๋ฅผ ์ƒ๊ฐํ•˜์˜€์œผ๋‚˜, ๋งจ ๋’ค์— ์žˆ๋Š” ์š”์†Œ๊ฐ€ 2๋ฒˆ์งธ ๊นŒ์ง€ ์žฅ๊ฑฐ๋ฆฌ ์ด๋™ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋งจ ๋’ค๋ฅผ `O(1)`์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•(๋ฐฐ์—ด์„ ๋– ์˜ฌ๋ฆผ)์ด ํ•„์š”ํ•  ๊ฒƒ์ด๋‹ค.
4+
<!-- Describe your approach to solving the problem. -->
5+
1. Deque์•ˆ์— ๋ชจ๋“  ๋…ธ๋“œ๋“ค์„ ์‚ฝ์ž…ํ•œ๋‹ค.
6+
- ์ฝ”๋“œ์—์„œ๋Š” ๋ฐฐ์—ด(`nodes`)์™€ ๋‘ ์ธ๋ฑ์Šค(`i`, `j`)๊ฐ€ `Deque`์˜ ์—ญํ• ์„ ๋Œ€์‹ ํ•œ๋‹ค.
7+
2. ๋งจ ์•ž, ๋งจ ๋’ค์—์„œ ํ•˜๋‚˜์”ฉ์„ ๋บ€๋‹ค. (`f`, `b`)
8+
3. ๋งจ ์•ž ์š”์†Œ ๋’ค์— ๋งจ ๋’ค ์š”์†Œ๋ฅผ ๋„ฃ๋Š”๋‹ค. (`f` --> `b` -- (๊ธฐ์กด) `f.Next`)
9+
3. reorder์ดํ›„ ๋งจ ๋งˆ์ง€๋ง‰ ์š”์†Œ์— `nil`์„ ์ถ”๊ฐ€ํ•ด ์ข…๋ฃŒ ์ง€์ ์„ ๋งŒ๋“ ๋‹ค.
10+
# Complexity
11+
- Time complexity: $O(n)$
12+
- ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ์˜ ๊ธธ์ด `n`์— ๋Œ€ํ•˜์—ฌ, ๋งํฌ๋“œ๋ฆฌ์ŠคํŠธ ์ˆœํšŒ์™€ ๋ฐฐ์—ด ์ˆœํšŒ ๋น„์šฉ `n`์ด ๋ฐœ์ƒํ•œ๋‹ค.
13+
- Space complexity: $O(n)$
14+
- ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ์˜ ๊ธธ์ด `n`์— ๋Œ€ํ•˜์—ฌ, ๋ฐฐ์—ด(`nodes`) ์ƒ์„ฑ์— ๋น„์šฉ `n`์ด ๋ฐœ์ƒํ•œ๋‹ค.
15+
# Code
16+
## Two Pointer(Deque)
17+
```go
18+
func reorderListv1(head *ListNode) {
19+
nodes := make([]*ListNode, 0, 25)
20+
for curr := head; curr != nil; curr = curr.Next {
21+
nodes = append(nodes, curr)
22+
}
23+
24+
i, j := 0, len(nodes)-1
25+
for i < j {
26+
nodes[j].Next = nodes[i].Next
27+
nodes[i].Next = nodes[j]
28+
29+
i++
30+
j--
31+
}
32+
nodes[i].Next = nil
33+
}
34+
35+
```
36+
37+
## ๋‹ค๋ฅธ ํ’€์ด
38+
: ์†”๋ฃจ์…˜์„ ๋ณด๋ฉฐ ๋’ค์ชฝ ์ ˆ๋ฐ˜์„ `reverse()`ํ•˜์—ฌ ํ•ด๊ฒฐํ•˜๋Š” ์†”๋ฃจ์…˜์ด ๋”์šฑ ์ง๊ด€์ ์œผ๋กœ ๋А๊ปด์กŒ๋‹ค.
39+
40+
```go
41+
func reverse(node *ListNode) *ListNode {
42+
var prev *ListNode
43+
curr := node
44+
for curr != nil {
45+
next := curr.Next
46+
curr.Next = prev
47+
prev = curr
48+
49+
curr = next
50+
}
51+
return prev
52+
}
53+
54+
func reorderList(head *ListNode) {
55+
slow, fast := head, head
56+
for fast != nil && fast.Next != nil {
57+
fast = fast.Next.Next
58+
slow = slow.Next
59+
}
60+
61+
curr, rCurr := head, reverse(slow.Next)
62+
slow.Next = nil
63+
for curr != nil && rCurr != nil {
64+
next, rNext := curr.Next, rCurr.Next
65+
66+
rCurr.Next = next
67+
curr.Next = rCurr
68+
69+
curr, rCurr = next, rNext
70+
}
71+
}
72+
73+
```
74+
: ์ธ๋ฑ์Šค ์กฐ์ ˆํ•˜๋Š” ๊ฒŒ ๊ฝค๋‚˜ ์–ด๋ ค์›Œ์„œ ์†”๋ฃจ์…˜์„ ์ฐธ๊ณ ํ–ˆ๋‹ค...

0 commit comments

Comments
ย (0)