์ด๋ชจ์ค ๋ฒ(Imos Method)์ด๋?
์ด๋ชจ์ค๋ฒ์ ๋์ ํฉ ์๊ณ ๋ฆฌ์ฆ์ ๋ค์ฐจ์, ๋ค์ฐจ์๋ก ํ์ฅํ ๊ฒ์ ์๋ฏธํ๋ค.
https://imoz.jp/algorithms/imos_method.html
ใใใๆณ
ใใใๆณใฎ็ดนไป่จไบใงใ
imoz.jp
1์ฐจ์ ์ด๋ชจ์ค ๋ฒ
- ๊ตฌ๊ฐ [l, r)์ x๋ฅผ ๋ํ๋ ์ฟผ๋ฆฌ๋ฅผ ์ฒ๋ฆฌํ ๋, ๋ฐฐ์ด d์ d[i] += x, d[r] -= x๋ฅผ ์ฒ๋ฆฌํ๋ค.
- ๋ชจ๋ ์ฟผ๋ฆฌ๋ฅผ ์ฒ๋ฆฌํ ํ ๋ฐฐ์ด d์ ๋ํด ๋์ ํฉ์ ๊ตฌํ๋ฉด ์๋ ๋ฐฐ์ด์ ๊ฐ ์์น์ ๋ํด ๋ํด์ง ๊ฐ์ ๊ตฌํ ์ ์๋ค.
- O(N+Q)๋ก ํจ์จ์ ์ด๋ค.
์์) ์๋ ์ ๊ตฌํ๊ธฐ
๋ฌธ์
์๋น์ ๋ฐฉ๋ฌธํ ๊ฐ ๊ณ ๊ฐ์ ์ ์ฅ ์๊ฐ๊ณผ ํด์ฅ ์๊ฐ์ด ์ฃผ์ด์ง๋ค. ๊ฐ์ ์๊ฐ์ ๊ฐ๊ฒ์ ์๋ ์๋์ ์์ ์ต๋๋ ๋ช ๋ช ์ธ๊ฐ?
์๋์ด ์๋์ ๊ฐ์ด ๋ฐฉ๋ฌธํ๋ค๊ณ ๊ฐ์ ํ์
์๊ฐ | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
1๋ฒ | O | O | O | |||||||
2๋ฒ | O | O | O | O | ||||||
3๋ฒ | O | O | ||||||||
4๋ฒ | O |
1. ๋์ด๋ธํ๊ฒ ๊ตฌํ๊ธฐ
s = [0, 2, 5, 8] # ์๋ i์ ์
์ฅ์๊ฐ s[i]
e = [3, 6, 7, 9] # ์๋ i์ ํด์ฅ์๊ฐ e[i]
C = 4 # ์๋์ ์
T = 10 # ์๊ฐ
table = [0 for _ in range(T)] # 0 ~ T ์๊ฐ๋์ ์ ๋ณด๋ฅผ ๊ธฐ๋กํ๊ธฐ ์ํ ํ
์ด๋ธ
# ๊ฐ ์๋์ ๋ํด ์
์ฅ์๊ฐ ~ ํด์ฅ์๊ฐ๊น์ง ํด๋น๋๋ table์ ์ธ๋ฑ์ค +1
for i in range(c):
for j in range(s[i], j[i]):
table[j] += 1
print(max(table))
์ ๊ฒฝ์ฐ์๋ ์๊ฐ ๋ณต์ก๋๋ O(CT)์ด๋ค.
2. ์ด๋ชจ์ค๋ฒ์ผ๋ก ๊ตฌํ๊ธฐ
์ด๋ชจ์ค ๋ฒ์ ์์ด๋์ด๋ ์์์ ๊ณผ ๋์ ๋ง์ ๊ธฐ๋กํ๋ ๋ฐ์ ์๋ค. ์์์ ์๋ +1, ๋์ ์๋ -1์ ๊ธฐ๋กํํ,
์ดํ์ ๋์ ํฉ์ ๊ตฌํ์ฌ ๋ต์ ๊ตฌํ๋ค.
s = [0, 2, 5, 8] # ์๋ i์ ์
์ฅ์๊ฐ s[i]
e = [3, 6, 7, 10] # ์๋ i์ ํด์ฅ์๊ฐ e[i]
C = 4 # ์๋์ ์
T = 10 # ์๊ฐ
table = [0 for _ in range(T+1)]
for i in range(c):
table[s[i]] += 1
table[e[i]] -= 1
# table : [1, 0, 1, -1, 0, 1, -1, -1, 1, -1, 0]
# ๋์ ํฉ ๊ณ์ฐ
for i in range(1, len(table)):
table[i] = table[i-1] + table[i]
# prefix : [1, 1, 2, 1, 1, 2, 1, 0, 1, 0, 0]
print(max(table)) # 2
์ ๊ฒฝ์ฐ์๋ ๊ตฌ๊ฐ ์
๋ฐ์ดํธ์ O(C), ๋์ ํฉ ๊ณ์ฐ์ O(T)
๋ฐ๋ผ์ ์ด O(C+T)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค.
2์ฐจ์ ์ด๋ชจ์ค ๋ฒ
์ด๋ชจ์ค ๋ฒ์ ๊ณ ์ฐจ์์ผ๋ก์ ํ์ฅ์ด ์ฉ์ดํ๋ค.
์์ ) ๋ชฌ์คํฐ์ ์ข ๋ฅ
๋ฌธ์
์๋ก ๋ค๋ฅธ ์๋ ์์๋ ๊ฐ๊ฐ ํ๊ฐ์ง ์ข ๋ฅ์ ๋ชฌ์คํฐ๊ฐ ๋ํ๋๋ค. (์๋๊ฐ ๊ฒน์น๋ฉด ์ฌ๋ฌ ๋ชฌ์คํฐ ์ถ๋ชฐ ๊ฐ๋ฅ) ๋ชฌ์คํฐ๋ ๋ฒ์ ๋ฐ์์๋ ๋์ค์ง ์๋๋ค. ํจ์จ์ ์ธ ์งํ์ ์ํด ํ๋์ ํ์ผ์์ ๋ํ๋๋ ๋ชฌ์คํฐ์ ์ข ๋ฅ์ ์ต๋์น๋ฅผ ๊ตฌํ๋ ค๊ณ ํ๋ค.
1. ๋์ด๋ธํ๊ฒ ๊ตฌํ๊ธฐ
# 2D ๋ฐฐ์ด ์ด๊ธฐํ
tiles = [[0 for x in range(W)] for y in range(H)]
# ๋ชฌ์คํฐ ์ถํ ์ฒ๋ฆฌ
for i in range(N):
# ๋ชฌ์คํฐ i๊ฐ ๋ํ๋๋ [(A[i],C[i]), (B[i],D[i]))์ ๋ฒ์์ 1์ ๋ํ๋ค
for y in range(C[i], D[i]):
for x in range(A[i], B[i]):
tiles[y][x] += 1
# ์ต๋๊ฐ ํ์ธ
tile_max = max(max(row) for row in tiles)
๊ฐ ๋ชฌ์คํฐ๊ฐ ๋ํ๋๋ ๋ฒ์์ ํฌํจ๋ ๋ชจ๋ ํ์ผ์ 1์ ๋ํด ๊ตฌํ ์ ์๋ค.
์ด ๊ฒฝ์ฐ์๋ O(NWH)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค.
2. ์ด๋ชจ์ค๋ฒ์ผ๋ก ๊ตฌํ๊ธฐ
์์ 1์ฐจ์์์๋ ์์์ง์ ์ +1, ๋ ์ง์ ์ -1์ ํ๊ณ ๋์ ํฉ์ ๊ตฌํ์ฌ ์ฐ๋ฆฌ๊ฐ ๊ตฌํ๋ ค๋ ์์ญ์ ๋ณต๊ตฌํ์๋ค.
์ ๋ฐฉ์์ 2์ฐจ์ ๊ณต๊ฐ์๋ ์ ์ฉํด๋ณด์
2์ฐจ์ ๊ณต๊ฐ์ 1์ฐจ์์์ y์ถ ๋ฐฉํฅ์ผ๋ก ๋์ด๋ ๋งํผ x์ถ์ผ๋ก ๋์ ํฉ์ ๊ตฌํ๊ณ , ๊ทธ ๋ค์ y์ถ์ผ๋ก ๋์ ํฉ์ ๊ตฌํ๋ฉด ๋๋ค.
์ฐ๋ฆฌ๊ฐ ๊ตฌํ๊ณ ์ ํ๋ ์ฌ๊ฐํ์ ์์ญ์ด ์์ ๊ฐ๋ค๊ณ ํ์. ๋ ๋ฒ์ ๋์ ํฉ ์ฐ์ฐ์ ํตํด ์ ๋ชจ์์ด ๋์ค๊ฒ ํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผํ ๊น?
์์ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ์ ํ ํ๋ฉด ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์๋ค.
๋จผ์ x์ถ ๋ฐฉํฅ์ผ๋ก ๋์ ํฉ์ ๊ตฌํ๊ณ
๊ทธ ๋ค์ y์ถ ๋ฐฉํฅ์ผ๋ก ๋์ ํฉ์ ๊ตฌํด์ฃผ๋ฉด ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๊ฒฐ๊ณผ์ ๋ชจ์์ด ๋์ค๊ฒ ๋๋ค!
์ด๋ฌํ ๋ชจ์์ ์ฐ๊ณ ์ ํ๋ค๋ฉด ์ด๋ป๊ฒ ํ๋ฉด ๋ ๊น?
์ด๊ธฐ ๊ฐ์ค์น๋ฅผ ์ ํ ํด๋๊ณ ๊ฐ๋ก๋ฐฉํฅ ๋์ , ์ธ๋ก๋ฐฉํฅ ๋์ ์ ์ํํ๋ฉด ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์๋ค.
# 2์ฐจ์ ๋ฐฐ์ด ์ด๊ธฐํ
tiles = [[0] * W for _ in range(H)]
# ๊ฐ์ค์น ์ถ๊ฐ
for i in range(N):
tiles[C[i]][A[i]] += 1
tiles[C[i]][B[i]] -= 1
tiles[D[i]][A[i]] -= 1
tiles[D[i]][B[i]] += 1
# ๊ฐ๋ก ๋ฐฉํฅ ๋์ ํฉ
for y in range(H):
for x in range(1, W):
tiles[y][x] += tiles[y][x-1]
# ์ธ๋ก ๋ฐฉํฅ ๋์ ํฉ
for y in range(1, H):
for x in range(W):
tiles[y][x] += tiles[y-1][x]
# ์ต๋๊ฐ ์ฐพ๊ธฐ
tile_max = 0
for y in range(H):
for x in range(W):
if tile_max < tiles[y][x]:
tile_max = tiles[y][x]
๊ฐ์ค์น ์ ๋ฐ์ดํธ : O(N)
์ด๊ธฐํ , ๊ฐ๋ก๋ฐฉํฅ ๋์ , ์ธ๋ก๋ฐฉํฅ ๋์ , ์ต๋ ๊ฐ ์ฐพ๊ธฐ : O(H * W)
์ต์ข ์ ์ธ ์๊ฐ ๋ณต์ก๋ : O(H * W * N)
'๐ค์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] 1669 - ๋ฉ๋ฉ์ด ์ฐ๋ค๋ฌ๊ธฐ (0) | 2024.11.20 |
---|---|
[์๊ณ ๋ฆฌ์ฆ] ์ด๋ถ ํ์ / ์ด์ง ํ์ (Binary Search) (0) | 2024.11.18 |
[์๊ณ ๋ฆฌ์ฆ] ์ต๋๊ณต์ฝ์์ ์ต์๊ณต๋ฐฐ์ (0) | 2024.10.13 |
[์๊ณ ๋ฆฌ์ฆ] - ๋ฐฐ๋ญ๋ฌธ์ (Knapsack Problem) (0) | 2024.09.03 |
[์๊ณ ๋ฆฌ์ฆ] ํ๋ฆผ ์๊ณ ๋ฆฌ์ฆ (Prim's Algorithm) (0) | 2024.08.30 |