[BOJ][๐ก5][๋ฐฑ์ค#16234] ์ธ๊ตฌ ์ด๋
์์ฑ:    
์ ๋ฐ์ดํธ:
์นดํ ๊ณ ๋ฆฌ: BOJ Gold V
๋ฌธ์ ์ถ์ฒ
๋ฌธ์
NรNํฌ๊ธฐ์ ๋ ์ด ์๊ณ , ๋ ์ 1ร1๊ฐ์ ์นธ์ผ๋ก ๋๋์ด์ ธ ์๋ค. ๊ฐ๊ฐ์ ๋ ์๋ ๋๋ผ๊ฐ ํ๋์ฉ ์กด์ฌํ๋ฉฐ, rํ c์ด์ ์๋ ๋๋ผ์๋ A[r][c]๋ช ์ด ์ด๊ณ ์๋ค. ์ธ์ ํ ๋๋ผ ์ฌ์ด์๋ ๊ตญ๊ฒฝ์ ์ด ์กด์ฌํ๋ค. ๋ชจ๋ ๋๋ผ๋ 1ร1 ํฌ๊ธฐ์ด๊ธฐ ๋๋ฌธ์, ๋ชจ๋ ๊ตญ๊ฒฝ์ ์ ์ ์ฌ๊ฐํ ํํ์ด๋ค. ์ค๋๋ถํฐ ์ธ๊ตฌ ์ด๋์ด ์์๋๋ ๋ ์ด๋ค. ์ธ๊ตฌ ์ด๋์ ํ๋ฃจ ๋์ ๋ค์๊ณผ ๊ฐ์ด ์งํ๋๊ณ , ๋ ์ด์ ์๋ ๋ฐฉ๋ฒ์ ์ํด ์ธ๊ตฌ ์ด๋์ด ์์ ๋๊น์ง ์ง์๋๋ค.
๊ตญ๊ฒฝ์ ์ ๊ณต์ ํ๋ ๋ ๋๋ผ์ ์ธ๊ตฌ ์ฐจ์ด๊ฐ L๋ช ์ด์, R๋ช ์ดํ๋ผ๋ฉด,ย ๋ ๋๋ผ๊ฐ ๊ณต์ ํ๋ ๊ตญ๊ฒฝ์ ์ ์ค๋ ํ๋ฃจ ๋์ ์ฐ๋ค. ์์ ์กฐ๊ฑด์ย ์ํด ์ด์ด์ผํ๋ ๊ตญ๊ฒฝ์ ์ด ๋ชจ๋ ์ด๋ ธ๋ค๋ฉด, ์ธ๊ตฌ ์ด๋์ ์์ํ๋ค. ๊ตญ๊ฒฝ์ ์ด ์ด๋ ค์์ด ์ธ์ ํ ์นธ๋ง์ ์ด์ฉํด ์ด๋ํ ์ ์์ผ๋ฉด, ๊ทธ ๋๋ผ๋ฅผ ์ค๋ ํ๋ฃจ ๋์์ ์ฐํฉ์ด๋ผ๊ณ ํ๋ค. ์ฐํฉ์ ์ด๋ฃจ๊ณ ์๋ ๊ฐ ์นธ์ ์ธ๊ตฌ์๋ (์ฐํฉ์ ์ธ๊ตฌ์) / (์ฐํฉ์ ์ด๋ฃจ๊ณ ์๋ ์นธ์ ๊ฐ์)๊ฐ ๋๋ค. ํธ์์ย ์์์ ์ ๋ฒ๋ฆฐ๋ค. ์ฐํฉ์ ํด์ฒดํ๊ณ , ๋ชจ๋ ๊ตญ๊ฒฝ์ ์ ๋ซ๋๋ค.
๊ฐ ๋๋ผ์ ์ธ๊ตฌ์๊ฐ ์ฃผ์ด์ก์ ๋, ์ธ๊ตฌ ์ด๋์ด ๋ฉฐ์น ๋์ ๋ฐ์ํ๋์ง ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ N, L, R์ด ์ฃผ์ด์ง๋ค. (1 โค N โค 50, 1 โค L โค R โค 100) ๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์ ๊ฐ ๋๋ผ์ ์ธ๊ตฌ์๊ฐ ์ฃผ์ด์ง๋ค. rํ c์ด์ ์ฃผ์ด์ง๋ ์ ์๋ A[r][c]์ ๊ฐ์ด๋ค. (0 โค A[r][c] โค 100) ์ธ๊ตฌ ์ด๋์ด ๋ฐ์ํ๋ ์ผ์๊ฐ 2,000๋ฒ ๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์ ๋ ฅ๋ง ์ฃผ์ด์ง๋ค.
์ถ๋ ฅ
์ธ๊ตฌ ์ด๋์ด ๋ฉฐ์น ๋์ย ๋ฐ์ํ๋์ง ์ฒซ์งธ ์ค์ ์ถ๋ ฅํ๋ค.
์์
์์ 1
์ ๋ ฅ
2 20 50
50 30
20 40
์ถ๋ ฅ
1
์์ 2
์ ๋ ฅ
2 40 50
50 30
20 40
์ถ๋ ฅ
0
์์ 3
์ ๋ ฅ
2 20 50
50 30
30 40
์ถ๋ ฅ
1
์์ 4
์ ๋ ฅ
3 5 10
10 15 20
20 30 25
40 22 10
์ถ๋ ฅ
2
์์ 5
์ ๋ ฅ
4 10 50
10 100 20 90
80 100 60 70
70 20 30 40
50 20 100 10
์ถ๋ ฅ
3
My Sol
def findUnion(i, j):
global visited, N, L, R, POP
visited[i][j] = 1
unionQ = [(i, j)]
start = -1
end = 1
while start < end-1:
start += 1
ni, nj = unionQ[start]
# ์ํ์ข์ฐ ํ์
didj = [(-1,0),(0,-1),(1,0),(0,1)]
for di, dj in didj:
# ํ์ ์ขํ๊ฐ ๋ฒ์ ๋ด์ ์๊ณ ,
if 0<=ni+di<N and 0<=nj+dj<N:
# ๋ฐฉ๋ฌธํ์ง ์์๋ ๊ณณ์ด๋ฉฐ,
if not visited[ni+di][nj+dj]:
# ํ์ฌ ์์น์ ์ธ๊ตฌ์ ์ฐจ์ด๊ฐ L ์ด์ R ์ดํ๋ผ๋ฉด
if L <= abs(POP[ni][nj] - POP[ni+di][nj+dj]) <= R:
# visited์ ๋ฐ์ํ๊ณ unionQ์ ์ถ๊ฐ
visited[ni+di][nj+dj] = 1
unionQ.append((ni+di, nj+dj))
end += 1
return unionQ
N, L, R = map(int, input().split())
POP = [list(map(int, input().split())) for _ in range(N)]
ret = 0
while True:
visited = [[0]*N for _ in range(N)]
unions = []
for i in range(N):
for j in range(N):
if not visited[i][j]:
union = findUnion(i, j)
# union์ด 2 ๊ตญ๊ฐ ์ด์์ผ ๋๋ง unions์ union ์ถ๊ฐ
if len(union) > 1:
unions.append(union)
# ์ข
๋ฃ์กฐ๊ฑด : unions๊ฐ ์์ผ๋ฉด ์ธ๊ตฌ ์ด๋ ์์
if not unions:
break
# POP2 ์์ฑ
POP2 = []
for lst in POP:
POP2.append(lst[::])
# ์ฐํฉ ๋ณ POP2์ ์ธ๊ตฌ ์ฌ๋ถ๋ฐฐ
for union in unions:
# ์ฐํฉ ๋ด ๋๋ผ ์, ์ธ๊ตฌ ํฉ๊ณ ๊ณ์ฐ
sum_pop = 0
cnt = 0
for country in union:
ci, cj = country
sum_pop += POP[ci][cj]
cnt += 1
# ์ฐํฉ ๋ด ์ธ๊ตฌ ์ฌ๋ถ๋ฐฐ
avg_pop = sum_pop // cnt
for country in union:
ci, cj = country
POP2[ci][cj] = avg_pop
# POP2๋ฅผ POP์ผ๋ก ๊ฐฑ์ (์์ ๋ณต์ฌ ๊ฐ๋ฅ)
POP = POP2
# ๊ฒฐ๊ณผ + 1
ret += 1
print(ret)
์๊ฐํ๋๋๋ก ํ ์ ์๋ ๋ฌธ์ ์๊ณ , ์ด๋ ค์ด ๋ฌธ์ ๋ค์ ํ๊ณ ์์ ๊ทธ๋ฐ๊ฐ ๊ทธ๋ ๊ฒ ์ด๋ ต๊ฒ ๋๊ปด์ง์ง๋ ์์๋ ๋ฌธ์ ์๋ค.
๋ฌธ์ ํ์ด ์ ๊ฐ ๋ฐฉ์
- ์ ๋ ฅ์ ๋ฐ์ ์ฒ๋ฆฌ
- visited 2์ฐจ์ ๋ฐฐ์ด๋ก ๋ชจ๋ ์ขํ์ ๋ํด ์์ ํ์
- visited๊ฐ 0์ธ ๊ฒฝ์ฐ ํด๋น ์ขํ๋ถํฐ ์ํ์ข์ฐ ํ์ธํ์ฌ ์ฐํฉ ๊ฐ๋ฅ ๊ตญ๊ฐ ์ฒดํฌ
- ๋ฒ์ ๋ด์ด๊ณ , ๋ฐฉ๋ฌธํ์ง ์์์ผ๋ฉฐ, ์ฐํฉ์ด ๊ฐ๋ฅํ๋ค๋ฉด, ์ฐํฉ์ ์ถ๊ฐ(visited๋ ์ฒดํฌ)
- BFS : ์ฐํฉ์ ์ถ๊ฐ๋ ๊ตญ๊ฐ ์ขํ ๊ธฐ์ค์ผ๋ก ์ํ์ข์ฐ๋ฅผ ์กฐํํ๋ฉฐ ๋ชจ๋ ๊ฐ๋ฅํ ์ฐํฉ์ ๋ํ Queue ์ฑ์ฐ๊ธฐ
- ํจ์ ์ธ๋ถ์ Union Queue๋ฅผ ์ ๋ฌํ๊ณ , ์ด๋ฅผ union ๋ด๋ถ ๊ตญ๊ฐ๊ฐ 2๊ฐ ์ด์์ด๋ผ๋ฉด unions ๋ฐฐ์ด์ ์ถ๊ฐ
- 2~6๋ฒ์ ๋ฐ๋ณตํ๋ฉฐ visited ๋ชจ๋ ์กฐํ
- unions์ ๊ฐ union์ ๊ตญ๊ฐ ์ขํ๋ก ํ๊ท ์ธ๊ตฌ ์ ๊ณ์ฐํ์ฌ ๋ณ๋์ 2์ฐจ์ ๋ฐฐ์ด์ ๋ฃ๊ธฐ
- ์ธ๊ตฌ ์ด๋ ํ์ 1 ์ฆ๊ฐ
- 1~9 ๋ฐ๋ณต : ์ข ๋ฃ ์กฐ๊ฑด์ ์ด๋ ํ ๊ตญ๊ฐ์๋ ์๋ก ์ธ๊ตฌ ์ด๋์ด ๊ฐ๋ฅํ์ง ์์ unions๊ฐ ๋น(False) ๊ฒฝ์ฐ
BFS๋ฅผ ์ด์ฉํ์ฌ ๊ฐ๋ฅํ ์ฐํฉ์ ์กฐํํ๋ ํจ์ findUnion() ํจ์๋ฅผ ๋ณ๋๋ก ์์ฑํ์ฌ visited ์กฐํ์ Union ํ์์ด ๊ฐ์์ ์ผ๋ก ๋ถ๋ฆฌ๋๋๋ก ์์ฑํ์๋ค. ์ฝ๋๋ณ ์์ธํ ์ค๋ช ์ ์ฃผ์ ์ฐธ๊ณ .
๊ฒฐ๊ณผ
๋ง์์ต๋๋ค!!
๋๊ธ๋จ๊ธฐ๊ธฐ