๊ตญ๋ฏผ๋ํ๊ต์์ "์ฝ๊ฒ ๋ฐฐ์ฐ๋ ์๊ณ ๋ฆฌ์ฆ" ๊ต์ฌ๋ฅผ ์ด์ฉํ
๋ฐํ๋ช ๊ต์๋์ ๊ฐ์ ๊ต์์ ์ด์ฉํ์ฌ ์์ ๋ด์ฉ์ ์ ๋ฆฌํ์์ต๋๋ค
Disjoint Sets
Disjoint Sets๋ ์๋ก ๊ฒน์น์ง ์๋ ์งํฉ๋ค์ ์๋ฏธํจ
=> ์ด์ฉํผ ๊ต์งํฉ์ด ๊ณต์งํฉ์ด๋ฏ๋ก intersect ์ฐ์ฐ์ ๋ฐ๋ก ์กด์ฌ X
โด Disjoint Set ์ฐ์ฐ์๋

- make-set(u) : u๋ฅผ ์ ์ผํ ์์๋ก ๊ฐ๋ ์งํฉ ์์ฑ
- find-set(u) : u๊ฐ ์ํ ์งํฉ ๋ฆฌํด
- union(u, v) : u๊ฐ ์ํ ์งํฉ๊ณผ v๊ฐ ์ํ ์งํฉ์ ํฉ์นจ
https://www.acmicpc.net/problem/1717
์งํฉ์ ํํ ์ด๋ผ๋ ๋ฐฑ์ค ๋ฌธ์ ๋ฅผ Disjoint Set ์ฐ์ฐ์ผ๋ก ํด๊ฒฐํ๋ ์ฝ๋๋ฅผ ์ดํด๋ณด์

python์ set์ ์ด๋ค๋ฉด union(u, v)๋ฅผ ํ ๋ u, v๊ฐ ์ํ ์งํฉ์ ์ฐพ๊ธฐ์ํด ๊ฐ๊ฐ O(n) ๋งํผ ์๊ฐ์ด ๊ฑธ๋ฆฌ๊ณ
u, v๊ฐ ์ํ ์งํฉ์ ํฉ์น๊ธฐ ์ํด ํ ์ชฝ์ ๊ฐ์ ๋ค ๋ฃ๋๋ฐ ์๊ฐ์ด ๋ ๊ฑธ๋ฆผ
=> ํ ๋ฒ์ ์ฐพ์ ์ ์๊ฒ ๋ฐฐ์ด์ ๋ง๋ ์ด๋๋ ํฉ์งํฉ์ ํ ๋ ๊ฒฐ๊ตญ n๋งํผ ๊ฑธ๋ฆฌ๋ฏ๋ก ๋นํจ์จ์
Naive Implementation of Disjoint Sets
๋ฐฐ์ด์ ์ด์ฉํ์ฌ ๊ฐ ์์๊ฐ ์ํ ์งํฉ์ ํํํด๋ณด๋ ๋ฐฉ๋ฒ์ ์๊ฐํ ์ ์์

- arr[u]๋ u๊ฐ ์ํ ์งํฉ์ ์๋ฏธ
- make-set(u) : arr[u] = u ๋ก ์ด๊ธฐํ
=> O(1) - find-set(u) : arr[u]๋ฅผ ๋ฆฌํด
=> O(1) - union(u, v) : v๊ฐ ์ํ ์งํฉ์ ๊ฐ์ u์ ์งํฉ์ผ๋ก ๋ณ๊ฒฝ
=> O(n)
(๋ฐฐ์ด์ ํ๋ฒ scan ํ๋ฉด์ ์ํ ์งํฉ์ ๋ฐ๊ฟ์ค์ผํ๋ฏ๋ก)
Parent Pointer Trees for Disjoint Sets
๊ฐ Tree๊ฐ ์งํฉ์ ๋ํ๋ด๋๋ก ๊ตฌํ

- Tree์ root๋ ํด๋น ์งํฉ์ ๋ํ ๋
ธ๋์
- find-set(u) : u๊ฐ ์ํ tree์ root๋ฅผ ๋ฆฌํด
=> O(tree ๋์ด)
(root๊น์ง ์ญ ์ฌ๋ผ๊ฐ์ ํ์ธํ๋ฏ๋ก) - union-set(u, v) : v๊ฐ ์ํ tree์ root๋ฅผ u๊ฐ ์ํ tree์ root์ ์ฐ๊ฒฐ
=> O(tree ๋์ด)
(u, v์ root๋ฅผ ํ์ธํ๊ณ ๋ ์ค ํ๋์ root๋ฅผ ๋ณ๊ฒฝํ๋ฏ๋ก O(tree์ ๋์ด) + O(tree์ ๋์ด) + O(1) = O(tree์ ๋์ด) ๊ฐ ๋จ)
ํ์ง๋ง ๊ฐ ๋ ธ๋๊ฐ ํ๋์ฉ ์ฐ๊ฒฐ๋๋ค๋ฉด ์ต์ ์ ๊ฒฝ์ฐ tree์ ๋์ด๋ n์ด ๋จ
=> find-set ์ union-set ๋ชจ๋ O(n)์ด ๋๋ฒ๋ฆฌ๋ ์ฐฝ์กฐ ์ํด๊ฐ ๋ฐ์ํจ
๊ทธ๋ผ ์ด์ ์ด๋ป๊ฒ tree์ ๋์ด๋ฅผ ๋ฎ๊ฒ ์ ์งํ ์ ์๋์ง๋ฅผ ๊ณ ๋ฏผํด๋ด์ผํจ
tree์ ๋์ด๋ฅผ ๋ฎ๊ฒ ์ ์งํ ์ ์๋ ์ต์ ํ ๋ฐฉ๋ฒ Union by Rank์ Path Compression์ ์ดํด๋ณด์
Union by Rank

2๊ฐ์ Tree๋ฅผ Unionํ ๋, ๋์ด๊ฐ ๋ฎ์ Tree๋ฅผ ๋์ Tree์ ์ฐ๊ฒฐ
์ฌ๊ธฐ์ ์๊ฐํด์ผํ ๋ถ๋ถ์ 2๊ฐ์ tree์ rank๊ฐ ๊ฐ์ ๋ ๋์ด๊ฐ ์ฆ๊ฐํ๋ค๋ ๊ฒ์
=> ๋ง์ฝ tree A์ B ๋ ์ค ํ๋๊ฐ ํฐ ๊ฒฝ์ฐ ํฉ์น๋ฉด ๋ ํฐ rank๋ฅผ ๋ฐ๋ผ๊ฐ

- A์ ๋์ด > B์ ๋์ด => A์ ๋์ด
- A์ ๋์ด < B์ ๋์ด => B์ ๋์ด
- A์ ๋์ด = B์ ๋์ด => (A ๋๋ B์ ๋์ด) + 1
์ ๊ทธ๋ฆผ์์ ํ๋ ๋ ์ ์ ์๋ ์ฌ์ค์ ๋์ด๊ฐ ๋์ด๋ ๋ ๋ง๋ค ๋
ธ๋๊ฐ 2๋ฐฐ์ฉ ์ฆ๊ฐํ๋ค๋ ๊ฒ์
์ฆ, ๋์ด๊ฐ h์ธ Tree๋ ์ต์ 2^h ๊ฐ์ ๋ ธ๋๋ฅผ ๊ฐ์ง (n >= 2^h)
=> ๋ ธ๋๊ฐ n๊ฐ์ธ Tree์ ๋์ด๋ ์ต๋ logn (logn >= h)
Tree์ ๋์ด๋ฅผ ๋ ์ค์ด๋ ค๋ฉด..?
Path Compression
Find-set(u) ์ฐ์ฐ์ ์ํํ ๋, ๊ฒฝ๋ก์์ ๋ชจ๋ ๋ ธ๋๋ฅผ Root์ ์ฐ๊ฒฐ

Complexity Analysis
n๋ฒ์ make-set ์ฐ์ฐ๊ณผ m๋ฒ์ union/find-set ์ฐ์ฐ์ด ์ํ๋ ๊ฒฝ์ฐ ์๊ฐ๋ณต์ก๋๋ฅผ ์ดํด๋ณด๋ฉด
- Union by Rank
=> O(mlogn) - Path Compression ์ ์ฉ
=> O(mlog*n)

=> log*n์ ์ฌ์ค์ ์์๋ผ๊ณ ๋ด๋ ๋ ์ ๋๋ก ์์
๋ฐ๋ผ์ ์ฌ์ค์ Path Compression์ ์๊ฐ๋ณต์ก๋๋ O(m)์!
Path Compression ํ ๋ ๋ ๋ฒ ๋ฐ๋ณตํ๋ ๊ฒ์ ํผํ๋ ค๋ฉด?
Additional Issues

Root๋ก ์ฐ๊ฒฐํ๋ ๋์ ์ ์กฐ๋ถ๋ชจ์ ์ฐ๊ฒฐ
=> ๊ฒฝ๋ก์ ๊ธธ์ด๊ฐ ์ ๋ฐ์ผ๋ก ์ค์ด๋๋ ํจ๊ณผ
Path-halving์ ๊ฒฝ์ฐ : ๋ถ๋ชจ์ ์ฐ๊ฒฐ์ ๋๊ณ ๊ทธ ์์ ์กฐ๋ถ๋ชจ๋ ์ฐ๊ฒฐํจ
(์ด ๋ ์ฐ๊ฒฐ์ด ๋๊ธด ๋ถ๋ชจ๋ ์ถ๊ฐ์ ์ผ๋ก ๋ญ ํ์ง ์๊ณ ๋์ด๊ฐ)
Path-splitting์ ๊ฒฝ์ฐ : ๋ถ๋ชจ์ ์ฐ๊ฒฐ์ ๋๊ณ ๊ทธ ์์ ์กฐ๋ถ๋ชจ๋ ์ฐ๊ฒฐํจ
(์ด ๋ ์ฐ๊ฒฐ์ด ๋๊ธด ๋ถ๋ชจ๋ ๊ฐ์ ๊ณผ์ ์ ์คํ)
๊ณตํต ์กฐ์์ด ์๋ ๋ ๋ ธ๋ u, v์ ๋ํด union ์ฐ์ฐ์ ๋นจ๋ฆฌ ๋๋ด๋ ค๋ฉด?

๊ธฐ์กด find-set(u), find-set(v) ๋ฅผ ์คํํ๋ฉด Root๊น์ง ์ฐ์ฐํ์ง๋ง
Rem's Algorithm์ ๊ณตํต ์กฐ์์ด ๋ํ๋๋ฉด ์ฐ์ฐ ์ข ๋ฃ
1. ๋์ ๋ถ๋ชจ๊ฐ ํญ์ ๋๋ณด๋ค ์ซ์๊ฐ ์ ์ ์ํ๋ก ๋ง๋ ํ
2. ๊ฐ leaf์ ํฌ์ธํฐ๋ฅผ ์ง์ ํด๋๊ณ ์์
3. ๋ถ๋ชจ๋ฅผ ํ์ธํ๊ณ ๋ถ๋ชจ์ ์๊ฐ ๋ ํฐ์ชฝ์ผ๋ก ํฌ์ธํฐ๋ฅผ ํ๋ ์ฌ๋ฆผ
4. ์ด๋ฅผ ๋ฐ๋ณตํ๋ค ์์ชฝ ๋ถ๋ชจ์ ์๊ฐ ๊ฐ์์ง๋ ์ฆ, ๊ณตํต ์กฐ์์ด ๋ํ๋๋ฉด ์ฐ์ฐ ์ข ๋ฃ
์ด ๋ find-set์ ์ฐ์ง ์์ผ๋ฏ๋ก Path Compression์ด ์ด๋ ต๊ธฐ ๋๋ฌธ์ Splicing ๊ธฐ๋ฒ ์ ์ฉ
=> ํฌ์ธํฐ๊ฐ ์๋ก ์ฌ๋ผ๊ฐ ๋ ์๊ธฐ ๋ถ๋ชจ์์ ์ฐ๊ฒฐ์ ๋๊ณ ์๋ ํฌ์ธํฐ์ ๋ถ๋ชจ๋ ์ฐ๊ฒฐ
'๐ฅ Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
L12 - Single Source Shortest Paths (0) | 2024.11.28 |
---|---|
L11 - Minimum Spanning Trees (0) | 2024.11.26 |
L09 - Greedy Algorithms (1) | 2024.11.03 |
L07 - Selection (4) | 2024.10.13 |
L06 - Non-comparison Sorting (2) | 2024.10.08 |
๊ตญ๋ฏผ๋ํ๊ต์์ "์ฝ๊ฒ ๋ฐฐ์ฐ๋ ์๊ณ ๋ฆฌ์ฆ" ๊ต์ฌ๋ฅผ ์ด์ฉํ
๋ฐํ๋ช ๊ต์๋์ ๊ฐ์ ๊ต์์ ์ด์ฉํ์ฌ ์์ ๋ด์ฉ์ ์ ๋ฆฌํ์์ต๋๋ค
Disjoint Sets
Disjoint Sets๋ ์๋ก ๊ฒน์น์ง ์๋ ์งํฉ๋ค์ ์๋ฏธํจ
=> ์ด์ฉํผ ๊ต์งํฉ์ด ๊ณต์งํฉ์ด๋ฏ๋ก intersect ์ฐ์ฐ์ ๋ฐ๋ก ์กด์ฌ X
โด Disjoint Set ์ฐ์ฐ์๋

- make-set(u) : u๋ฅผ ์ ์ผํ ์์๋ก ๊ฐ๋ ์งํฉ ์์ฑ
- find-set(u) : u๊ฐ ์ํ ์งํฉ ๋ฆฌํด
- union(u, v) : u๊ฐ ์ํ ์งํฉ๊ณผ v๊ฐ ์ํ ์งํฉ์ ํฉ์นจ
https://www.acmicpc.net/problem/1717
์งํฉ์ ํํ ์ด๋ผ๋ ๋ฐฑ์ค ๋ฌธ์ ๋ฅผ Disjoint Set ์ฐ์ฐ์ผ๋ก ํด๊ฒฐํ๋ ์ฝ๋๋ฅผ ์ดํด๋ณด์

python์ set์ ์ด๋ค๋ฉด union(u, v)๋ฅผ ํ ๋ u, v๊ฐ ์ํ ์งํฉ์ ์ฐพ๊ธฐ์ํด ๊ฐ๊ฐ O(n) ๋งํผ ์๊ฐ์ด ๊ฑธ๋ฆฌ๊ณ
u, v๊ฐ ์ํ ์งํฉ์ ํฉ์น๊ธฐ ์ํด ํ ์ชฝ์ ๊ฐ์ ๋ค ๋ฃ๋๋ฐ ์๊ฐ์ด ๋ ๊ฑธ๋ฆผ
=> ํ ๋ฒ์ ์ฐพ์ ์ ์๊ฒ ๋ฐฐ์ด์ ๋ง๋ ์ด๋๋ ํฉ์งํฉ์ ํ ๋ ๊ฒฐ๊ตญ n๋งํผ ๊ฑธ๋ฆฌ๋ฏ๋ก ๋นํจ์จ์
Naive Implementation of Disjoint Sets
๋ฐฐ์ด์ ์ด์ฉํ์ฌ ๊ฐ ์์๊ฐ ์ํ ์งํฉ์ ํํํด๋ณด๋ ๋ฐฉ๋ฒ์ ์๊ฐํ ์ ์์

- arr[u]๋ u๊ฐ ์ํ ์งํฉ์ ์๋ฏธ
- make-set(u) : arr[u] = u ๋ก ์ด๊ธฐํ
=> O(1) - find-set(u) : arr[u]๋ฅผ ๋ฆฌํด
=> O(1) - union(u, v) : v๊ฐ ์ํ ์งํฉ์ ๊ฐ์ u์ ์งํฉ์ผ๋ก ๋ณ๊ฒฝ
=> O(n)
(๋ฐฐ์ด์ ํ๋ฒ scan ํ๋ฉด์ ์ํ ์งํฉ์ ๋ฐ๊ฟ์ค์ผํ๋ฏ๋ก)
Parent Pointer Trees for Disjoint Sets
๊ฐ Tree๊ฐ ์งํฉ์ ๋ํ๋ด๋๋ก ๊ตฌํ

- Tree์ root๋ ํด๋น ์งํฉ์ ๋ํ ๋
ธ๋์
- find-set(u) : u๊ฐ ์ํ tree์ root๋ฅผ ๋ฆฌํด
=> O(tree ๋์ด)
(root๊น์ง ์ญ ์ฌ๋ผ๊ฐ์ ํ์ธํ๋ฏ๋ก) - union-set(u, v) : v๊ฐ ์ํ tree์ root๋ฅผ u๊ฐ ์ํ tree์ root์ ์ฐ๊ฒฐ
=> O(tree ๋์ด)
(u, v์ root๋ฅผ ํ์ธํ๊ณ ๋ ์ค ํ๋์ root๋ฅผ ๋ณ๊ฒฝํ๋ฏ๋ก O(tree์ ๋์ด) + O(tree์ ๋์ด) + O(1) = O(tree์ ๋์ด) ๊ฐ ๋จ)
ํ์ง๋ง ๊ฐ ๋ ธ๋๊ฐ ํ๋์ฉ ์ฐ๊ฒฐ๋๋ค๋ฉด ์ต์ ์ ๊ฒฝ์ฐ tree์ ๋์ด๋ n์ด ๋จ
=> find-set ์ union-set ๋ชจ๋ O(n)์ด ๋๋ฒ๋ฆฌ๋ ์ฐฝ์กฐ ์ํด๊ฐ ๋ฐ์ํจ
๊ทธ๋ผ ์ด์ ์ด๋ป๊ฒ tree์ ๋์ด๋ฅผ ๋ฎ๊ฒ ์ ์งํ ์ ์๋์ง๋ฅผ ๊ณ ๋ฏผํด๋ด์ผํจ
tree์ ๋์ด๋ฅผ ๋ฎ๊ฒ ์ ์งํ ์ ์๋ ์ต์ ํ ๋ฐฉ๋ฒ Union by Rank์ Path Compression์ ์ดํด๋ณด์
Union by Rank

2๊ฐ์ Tree๋ฅผ Unionํ ๋, ๋์ด๊ฐ ๋ฎ์ Tree๋ฅผ ๋์ Tree์ ์ฐ๊ฒฐ
์ฌ๊ธฐ์ ์๊ฐํด์ผํ ๋ถ๋ถ์ 2๊ฐ์ tree์ rank๊ฐ ๊ฐ์ ๋ ๋์ด๊ฐ ์ฆ๊ฐํ๋ค๋ ๊ฒ์
=> ๋ง์ฝ tree A์ B ๋ ์ค ํ๋๊ฐ ํฐ ๊ฒฝ์ฐ ํฉ์น๋ฉด ๋ ํฐ rank๋ฅผ ๋ฐ๋ผ๊ฐ

- A์ ๋์ด > B์ ๋์ด => A์ ๋์ด
- A์ ๋์ด < B์ ๋์ด => B์ ๋์ด
- A์ ๋์ด = B์ ๋์ด => (A ๋๋ B์ ๋์ด) + 1
์ ๊ทธ๋ฆผ์์ ํ๋ ๋ ์ ์ ์๋ ์ฌ์ค์ ๋์ด๊ฐ ๋์ด๋ ๋ ๋ง๋ค ๋
ธ๋๊ฐ 2๋ฐฐ์ฉ ์ฆ๊ฐํ๋ค๋ ๊ฒ์
์ฆ, ๋์ด๊ฐ h์ธ Tree๋ ์ต์ 2^h ๊ฐ์ ๋ ธ๋๋ฅผ ๊ฐ์ง (n >= 2^h)
=> ๋ ธ๋๊ฐ n๊ฐ์ธ Tree์ ๋์ด๋ ์ต๋ logn (logn >= h)
Tree์ ๋์ด๋ฅผ ๋ ์ค์ด๋ ค๋ฉด..?
Path Compression
Find-set(u) ์ฐ์ฐ์ ์ํํ ๋, ๊ฒฝ๋ก์์ ๋ชจ๋ ๋ ธ๋๋ฅผ Root์ ์ฐ๊ฒฐ

Complexity Analysis
n๋ฒ์ make-set ์ฐ์ฐ๊ณผ m๋ฒ์ union/find-set ์ฐ์ฐ์ด ์ํ๋ ๊ฒฝ์ฐ ์๊ฐ๋ณต์ก๋๋ฅผ ์ดํด๋ณด๋ฉด
- Union by Rank
=> O(mlogn) - Path Compression ์ ์ฉ
=> O(mlog*n)

=> log*n์ ์ฌ์ค์ ์์๋ผ๊ณ ๋ด๋ ๋ ์ ๋๋ก ์์
๋ฐ๋ผ์ ์ฌ์ค์ Path Compression์ ์๊ฐ๋ณต์ก๋๋ O(m)์!
Path Compression ํ ๋ ๋ ๋ฒ ๋ฐ๋ณตํ๋ ๊ฒ์ ํผํ๋ ค๋ฉด?
Additional Issues

Root๋ก ์ฐ๊ฒฐํ๋ ๋์ ์ ์กฐ๋ถ๋ชจ์ ์ฐ๊ฒฐ
=> ๊ฒฝ๋ก์ ๊ธธ์ด๊ฐ ์ ๋ฐ์ผ๋ก ์ค์ด๋๋ ํจ๊ณผ
Path-halving์ ๊ฒฝ์ฐ : ๋ถ๋ชจ์ ์ฐ๊ฒฐ์ ๋๊ณ ๊ทธ ์์ ์กฐ๋ถ๋ชจ๋ ์ฐ๊ฒฐํจ
(์ด ๋ ์ฐ๊ฒฐ์ด ๋๊ธด ๋ถ๋ชจ๋ ์ถ๊ฐ์ ์ผ๋ก ๋ญ ํ์ง ์๊ณ ๋์ด๊ฐ)
Path-splitting์ ๊ฒฝ์ฐ : ๋ถ๋ชจ์ ์ฐ๊ฒฐ์ ๋๊ณ ๊ทธ ์์ ์กฐ๋ถ๋ชจ๋ ์ฐ๊ฒฐํจ
(์ด ๋ ์ฐ๊ฒฐ์ด ๋๊ธด ๋ถ๋ชจ๋ ๊ฐ์ ๊ณผ์ ์ ์คํ)
๊ณตํต ์กฐ์์ด ์๋ ๋ ๋ ธ๋ u, v์ ๋ํด union ์ฐ์ฐ์ ๋นจ๋ฆฌ ๋๋ด๋ ค๋ฉด?

๊ธฐ์กด find-set(u), find-set(v) ๋ฅผ ์คํํ๋ฉด Root๊น์ง ์ฐ์ฐํ์ง๋ง
Rem's Algorithm์ ๊ณตํต ์กฐ์์ด ๋ํ๋๋ฉด ์ฐ์ฐ ์ข ๋ฃ
1. ๋์ ๋ถ๋ชจ๊ฐ ํญ์ ๋๋ณด๋ค ์ซ์๊ฐ ์ ์ ์ํ๋ก ๋ง๋ ํ
2. ๊ฐ leaf์ ํฌ์ธํฐ๋ฅผ ์ง์ ํด๋๊ณ ์์
3. ๋ถ๋ชจ๋ฅผ ํ์ธํ๊ณ ๋ถ๋ชจ์ ์๊ฐ ๋ ํฐ์ชฝ์ผ๋ก ํฌ์ธํฐ๋ฅผ ํ๋ ์ฌ๋ฆผ
4. ์ด๋ฅผ ๋ฐ๋ณตํ๋ค ์์ชฝ ๋ถ๋ชจ์ ์๊ฐ ๊ฐ์์ง๋ ์ฆ, ๊ณตํต ์กฐ์์ด ๋ํ๋๋ฉด ์ฐ์ฐ ์ข ๋ฃ
์ด ๋ find-set์ ์ฐ์ง ์์ผ๋ฏ๋ก Path Compression์ด ์ด๋ ต๊ธฐ ๋๋ฌธ์ Splicing ๊ธฐ๋ฒ ์ ์ฉ
=> ํฌ์ธํฐ๊ฐ ์๋ก ์ฌ๋ผ๊ฐ ๋ ์๊ธฐ ๋ถ๋ชจ์์ ์ฐ๊ฒฐ์ ๋๊ณ ์๋ ํฌ์ธํฐ์ ๋ถ๋ชจ๋ ์ฐ๊ฒฐ
'๐ฅ Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
L12 - Single Source Shortest Paths (0) | 2024.11.28 |
---|---|
L11 - Minimum Spanning Trees (0) | 2024.11.26 |
L09 - Greedy Algorithms (1) | 2024.11.03 |
L07 - Selection (4) | 2024.10.13 |
L06 - Non-comparison Sorting (2) | 2024.10.08 |