๐๋ฌธ์
https://www.acmicpc.net/problem/1926
๐์ด๋ค ์๊ณ ๋ฆฌ์ฆ?
1. ๊ทธ๋ํ ํ์ ์๋ ์์ฒด๋ bfs๊ฐ ๋น ๋ฅด๋ค.
2. ๊ทธ๋ํ๊ฐ ํฌ๊ฑฐ๋ ๊ฒฝ๋ก์ ํน์ง์ ์ ์ฅํด์ผ ํ ๊ฒฝ์ฐ๋ dfs๊ฐ ์ ๋ฆฌํ๋ค.
3. ๊ทธ๋ํ๊ฐ ํฌ์ง ์๊ณ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํด์ผ ํ๋ ๊ฒฝ์ฐ๋ bfs๊ฐ ์ ๋ฆฌํ๋ค.
4. ์ด ๋ฌธ์ ์ ๊ฒฝ์ฐ ๊ทธ๋ํ๊ฐ ํฌ์ง ์์ผ๋ฏ๋ก bfs๋ฅผ ์ฌ์ฉํ๊ธฐ๋ก ๊ฒฐ์ .
๐ป์ฝ๋
from collections import deque
# ๊ทธ๋ฆผ ๋์ด๋ฅผ ๋ฐํํ๋ bfsํจ์
def bfs(x,y):
deq = deque() # ํ ์ค์
deq.append([x,y]) # ํ์ฌ ์ขํ ํ์ ์ฝ์
count_area = 1 # ํ์ฌ ์ขํ ๋ฐฉ๋ฌธ ํ ํ์ ์ฝ์
ํ์ผ๋ฏ๋ก 1๋ถํฐ
graph[x][y] = 0 # ํ์ฌ ์ขํ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
# ์ํ์ข์ฐ ์ขํ
dx = [0,0,-1,1]
dy = [1,-1,0,0]
while deq:
x,y = deq.popleft() # ํ์์ ์์๋ฅผ ๋นผ๋ด๋ฉฐ ํ์ ์์
for i in range(4): # ๋นผ๋ธ ์์ ์ํ์ข์ฐ ํ์
nx = x + dx[i]
ny = y + dy[i]
# ๋ํ์ง ๋ฒ์ด๋ ๊ฒฝ์ฐ ๋ฌด์
if nx < 0 or nx > (n-1) or ny < 0 or ny > (m-1):
continue
if graph[nx][ny] == 1:
graph[nx][ny] = 0
count_area += 1 # ๊ทธ๋ฆผ ๋์ด +1
deq.append([nx,ny]) # ์ขํ ํ์ ์ ์ฅ
return count_area
# n: ์ธ๋ก(x), m: ๊ฐ๋ก(y)
n,m = map(int,input().split())
# ๋ํ์ง
graph = []
for i in range(n):
graph.append(list(map(int,input().split())))
# ๊ทธ๋ฆผ ํฌ๊ธฐ ์ ์ฅํ ๋ฆฌ์คํธ
area_lst = []
# ํ์ ์์
for i in range(n):
for j in range(m):
if graph[i][j]: # ํด๋น ์นธ์ ๊ฐ์ด 1์ด๋ฉด
area_lst.append(bfs(i,j)) # bfs ํ์์ผ๋ก ์์๋ธ ๊ทธ๋ฆผ ๋์ด area_lst์ ์ฝ์
cnt = len(area_lst) # ๊ทธ๋ฆผ ๊ฐ์
print(cnt)
if cnt == 0:
print(0)
else:
print(max(area_lst))
๐์ฝ๋ ์ค๋ช
๊ทธ๋ฆผ์ ๊ฐ์์ ๊ฐ์ฅ ๋์ ๊ทธ๋ฆผ์ ๋์ด๋ฅผ ์ถ๋ ฅํ๋ ๋ฌธ์ ์ด๋ค.
1. ๋ํ์ง ํฌ๊ธฐ n,m์ ์ ๋ ฅ๋ฐ๊ณ , n๊ณผ m์ด ์ธ๋ก์ ํด๋นํ๋์ง, ๊ฐ๋ก์ ํด๋นํ๋์ง๋ฅผ ๊ผญ ์ ์ด๋์ ๋์ค์ ์ฝ๋๋ฅผ ์์ฑํ๋ฉด์ ํท๊ฐ๋ฆฌ๋ ์ผ์ด ์๋๋ก ํ๋ค.
2. ๋ํ์ง๋ฅผ 2์ฐจ์ ๋ฐฐ์ด๋ก ์ ๋ ฅ๋ฐ์ ์ ์๋๋ก ํ๋ค.
3. ๋ชจ๋ ๊ทธ๋ฆผ์ ๋์ด๋ฅผ ์์์ผ ๊ฐ์ฅ ๋์ ๊ทธ๋ฆผ์ ๋์ด๋ฅผ ์ ์ ์์ผ๋ฏ๋ก ๊ทธ๋ฆผ ํฌ๊ธฐ๋ฅผ ์ ์ฅํ ๋ฆฌ์คํธ๋ฅผ ๋ง๋ค์ด์ค๋ค.
4. ์์ bfs๋ฅผ ์ฌ์ฉํ๊ธฐ๋ก ๊ฒฐ์ ํ๋ค. bfs๋ ๋ชจ๋ ์นธ์ ํ์ธํ๋ ๊ธฐ๋ฒ(์๊ฐ๋ณต์ก๋๋ O(N)) ์ด๋ฏ๋ก ์ด์ค for๋ฌธ์ ํตํด ๋ชจ๋ ์นธ์ ํ๋ฒ์ฉ ์ ๊ทผํ ์ ์๋๋ก ํ๋ค.
5. ์ ๊ทผํ ํด๋น ์นธ์ ๊ฐ์ด 0์ด๋ฉด ๊ทธ๋ฆผ์ด ์๋๋ฏ๋ก ๋ฌด์ํ๊ณ , ๊ฐ์ด 1์ด๋ฉด ํด๋น ์นธ๋ถํฐ ๊ทธ๋ฆผ์ ๋์ด๋ฅผ ์กฐ์ฌํด์ ๋ฆฌ์คํธ์ ์ถ๊ฐํ๋๋ก ํ๋ค.
6. ์ฌ๊ธฐ๊น์ง ์ฝ๋๋ฅผ ์์ฑ ํ, ๊ทธ๋ฆผ์ ๋์ด๋ฅผ ์กฐ์ฌํด์ ๋ฆฌ์คํธ์ ์ถ๊ฐํ๋๋ก ํ๊ธฐ์ํด ๊ทธ๋ฆผ์ ๋์ด๋ฅผ ๋ฐํํ๋ ํจ์์ธ bfs()๋ฅผ ์์ฑํ๋ค.
7. bfs๋ ํ๋ฅผ์ฌ์ฉํ๋ ๊ธฐ๋ฒ์ด๋ฏ๋ก ํ๋ฅผ ํ๋ ๋ง๋ค์ด์ฃผ๊ณ , ํด๋น ์นธ์ ์ด๋ฏธ ๊ฐ์ด 1์์ ํ์ธํ๊ณ bfsํจ์๋ก ๋ค์ด์์ผ๋ฏ๋ก ๋์ด๋ฅผ ํ์ ํ๊ธฐ ์ํด ์ค์ ํ ๋ณ์ count_area = 1๋ก ์ค์ ํ๋ค. ๋ํ ํด๋น ์นธ์ ๊ฐ์ 0์ผ๋ก ์ค์ ํจ์ผ๋ก์จ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
8. ์ฃผ๋ณ ์ํ์ข์ฐ 4๋ฐฉํฅ์ ์ดํผ๊ธฐ ์ํด dx์ dy๋ฅผ ์ค์ ํ๋ค.
9. ํ๊ฐ ๋ชจ๋ ๋น๊ฒ ๋๋ฉด while๋ฌธ์ ํ์ถํ ์ ์๋๋ก ํ๋ค.
10. ํ์์ ์์๋ฅผ ๋นผ๋ด๋ฉฐ ํด๋น ์ขํ๋ถํฐ ํ์ ์์.
11. ๋นผ๋ธ ์์(์ขํ)์ ์ํ์ข์ฐ๋ฅผ ํ์ํ๊ธฐ ์์ํ๋ค.
12. ํด๋น ๋ํ์ง๋ฅผ ๋ฒ์ด๋ ์ขํ๋ ๋ฌด์๋๋๋ก ํ๋ค.
13. ํด๋น ์ขํ๋ก๋ถํฐ ์ํ์ข์ฐ๋ฅผ ํ์ํ๋๋ฐ, ํ์๋ ์ขํ์ ๊ฐ์ด 1์ด๋ฉด ํด๋น ์นธ์ ๊ฐ์ 0์ผ๋ก ์ค์ ํ๊ณ , count_area์ +1 ํ๋ค, ํ์ ์ง์ด ๋ฃ์ด์ ์ ๊ทธ ์ขํ ๋ํ ์ํ์ข์ฐ๋ฅผ ํ์ํ ์ ์๋๋ก ํ๋ค.
14. ํ๊ฐ ๋น์ด์ ํด๋น ์ขํ๋ก๋ถํฐ ์ธ์ ํ ๋ชจ๋ ์นธ์ ์กฐ์ฌํ ํ, ๊ทธ ๋์ด๋ฅผ ๋ฐํํ๋ค.
15. ๋ฐํ๋ฐ์ ๋์ด๋ฅผ area_lst์ ํด๋น์นธ๊ณผ ์ด์ด์ ธ์๋ ๋ชจ๋ ์นธ์ ๋์ด(์ฆ, ๊ทธ๋ฆผ์ ๋์ด)๋ฅผ ์ถ๊ฐํ๋ค.
16. area_lst์ ๋ชจ๋ ๊ทธ๋ฆผ์ ๋์ด๊ฐ ๋ค์ด๊ฐ ์์ผ๋ฏ๋ก, ๊ธธ์ด๋ฅผ ์กฐ์ฌํ๋ฉด ๊ทธ๋ฆผ์ ๊ฐ์๋ฅผ ์ ์ ์๋ค.
17. ์ถ๋ ฅ
'Algorithm > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] 9498 ์ํ ์ฑ์ (ํ์ด์ฌ/python) (0) | 2023.06.19 |
---|---|
[๋ฐฑ์ค] 1330 ๋ ์ ๋น๊ตํ๊ธฐ (ํ์ด์ฌ/python) (0) | 2023.06.19 |
[๋ฐฑ์ค] 4179 ๋ถ! (ํ์ด์ฌ/python) (with ๋ฉ๋ชจ๋ฆฌ ์ด๊ณผ) (1) | 2023.06.19 |
[๋ฐฑ์ค] 7576 ํ ๋งํ (ํ์ด์ฌ/python) (0) | 2023.06.19 |
[๋ฐฑ์ค] 2178 ๋ฏธ๋ก (ํ์ด์ฌ/python) (0) | 2023.06.19 |