๐ฉโ๐ป๐ญ [baekjoon] 1962๋ฒ: ๊ทธ๋ฆผ
๐๏ธย solution
import sys
from collections import deque
from typing import List
"""
[์๊ฐ]
1) 16:50 ~ 17:20
[์์ฝ]
1) ํฐ ๋ํ์ง์ ๊ทธ๋ฆผ์ด ๊ทธ๋ ค์ ธ ์์ ๋, ๊ทธ ๊ทธ๋ฆผ์ ๊ฐ์์, ๊ทธ ๊ทธ๋ฆผ ์ค ๋์ด๊ฐ ๊ฐ์ฅ ๋์ ๊ฒ์ ๋์ด๋ฅผ ์ถ๋ ฅ
- ์์ญ ๊ตฌ๋ถ ๋ฐ ๋์ด๊ฐ ๊ฐ์ฅ ํฐ ์์ญ์ ๋์ด ๊ตฌํ๋ ํ๋ก๊ทธ๋จ ์์ฑ
- ์ํ์ข์ฐ 1๋ก ์ฐ๊ฒฐ๋ ๊ฒ์ด ๊ทธ๋ฆผ
[์ ๋ต]
1) BFS
- ์๊ฐ์ ๋๋ํจ
- ์กฐ๊ฑด๋ฌธ์์ ๋ค์ค์กฐ๊ฑด ์ธ ๋ ์์ ์ ์ํด์ ์์ฑํ๊ธฐ
"""
def bfs(y: int, x: int, visit: List[bool]) -> int:
visit[y][x] = True
queue = deque()
queue.append([y, x])
count = 1
while queue:
vy, vx = queue.popleft()
for i in range(4):
ny = dy[i] + vy
nx = dx[i] + vx
if -1 < ny < N and -1 < nx < M and paper[ny][nx] == 1 and not visit[ny][nx]:
visit[ny][nx] = True
queue.append([ny, nx])
count += 1
return count
N, M = map(int, sys.stdin.readline().split())
paper = [list(map(int, sys.stdin.readline().split())) for _ in range(N)]
visited = [[False]*M for _ in range(N)]
dy = [0, 0, -1, 1]
dx = [-1, 1, 0, 0]
result = []
for i in range(N):
for j in range(M):
if paper[i][j] == 1 and not visited[i][j]:
result.append(bfs(i, j, visited))
print(len(result))
print(max(result) if len(result) != 0 else 0)
๐กย idea
- 1)
BFS
๋ก ํ์ด- ํ
์ด๋ธ ํํ๋ก ์๋ฃ๊ตฌ์กฐ๊ฐ ์ฃผ์ด์ง๋ฉด BFS๋ก ์ ๊ทผํ๋๊ฒ ์ข ๋ ํธ๋ฆฌ
- ํนํ ์์ญ ๋ถํ , ๋์ด ๊ตฌํ๋ ๋ฌธ์ ๋
BFS
๊ฐ ์ ๋ฆฌ recursionlimit
๋ ํผํ ์ ์์
- ํนํ ์์ญ ๋ถํ , ๋์ด ๊ตฌํ๋ ๋ฌธ์ ๋
- ์กฐ๊ฑด๋ฌธ์์ ๋ค์ค ์กฐ๊ฑด ์ฌ์ฉํ ๋, ์์ ์ ์ํด์ ์กฐ๊ฑด ๋์ดํ๊ธฐ
- ์์ ๋ง๋๋ก ๋งํ๋ฉด
IndexError
๋ฐ์
- ์์ ๋ง๋๋ก ๋งํ๋ฉด
- ๋ํ์ง์ ๊ทธ๋ฆผ์ด ์๋ ๊ฒฝ์ฐ ์์ธ์ฒ๋ฆฌ
- ํ
์ด๋ธ ํํ๋ก ์๋ฃ๊ตฌ์กฐ๊ฐ ์ฃผ์ด์ง๋ฉด BFS๋ก ์ ๊ทผํ๋๊ฒ ์ข ๋ ํธ๋ฆฌ
๐งชย experiement
Experiment Result
์ฒซ๋ฒ์งธ ํ์ด ์ ์ถ์ ๋ฉ์๋์ visited
๋ณ์๋ฅผ ์ง์ญ ๋ณ์
๋ก ํ ๋นํ๊ณ ์ฌ์ฉํ ๊ฒฐ๊ณผ๊ณ , ๋๋ฒ์งธ ํ์ด ์ ์ถ์ ์ ์ญ ๋ณ์
์ฒ๋ฆฌํ๊ณ ์ป์ ๊ฒฐ๊ณผ๋ค. ์ ์๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ ์๋นํ๋ฉฐ, ์ฐ์ฐ ์ญ์ ๋ ๋น ๋ฅธ ๋ชจ์ต์ด๋ค. ๋ฐ๋์ ๋ฉ์๋์์ ์ฌ์ฉํ ๋ณ์๋ค์ ๋ชจ๋ ์คํ์ ํ ๋นํด ์ง์ญ ๋ณ์๋ก ์ฌ์ฉํ์.
Leave a comment