[BOJ][๐ก5][๋ฐฑ์ค#02589] ๋ณด๋ฌผ์ฌ
์์ฑ:    
์ ๋ฐ์ดํธ:
์นดํ ๊ณ ๋ฆฌ: BOJ Gold V
๋ฌธ์ ์ถ์ฒ
๋ฌธ์
๋ณด๋ฌผ์ฌ ์ง๋๋ฅผ ๋ฐ๊ฒฌํ ํํฌ ์ ์ฅ์ ๋ณด๋ฌผ์ ์ฐพ์๋์ฐ๋ค. ๋ณด๋ฌผ์ฌ ์ง๋๋ ์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ์ง์ฌ๊ฐํ ๋ชจ์์ด๋ฉฐ ์ฌ๋ฌ ์นธ์ผ๋ก ๋๋์ด์ ธ ์๋ค. ๊ฐ ์นธ์ ์ก์ง(L)๋ ๋ฐ๋ค(W)๋ก ํ์๋์ด ์๋ค. ์ด ์ง๋์์ ์ด๋์ ์ํ์ข์ฐ๋ก ์ด์ํ ์ก์ง๋ก๋ง ๊ฐ๋ฅํ๋ฉฐ, ํ ์นธ ์ด๋ํ๋๋ฐ ํ ์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค. ๋ณด๋ฌผ์ ์๋ก ๊ฐ์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ก ์ด๋ํ๋๋ฐ ์์ด ๊ฐ์ฅ ๊ธด ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ ์ก์ง ๋ ๊ณณ์ ๋๋์ด ๋ฌปํ์๋ค. ์ก์ง๋ฅผ ๋ํ๋ด๋ ๋ ๊ณณ ์ฌ์ด๋ฅผ ์ต๋จ ๊ฑฐ๋ฆฌ๋ก ์ด๋ํ๋ ค๋ฉด ๊ฐ์ ๊ณณ์ ๋ ๋ฒ ์ด์ ์ง๋๊ฐ๊ฑฐ๋, ๋ฉ๋ฆฌ ๋์๊ฐ์๋ ์ ๋๋ค.
์๋ฅผ ๋ค์ด ์์ ๊ฐ์ด ์ง๋๊ฐ ์ฃผ์ด์ก๋ค๋ฉด ๋ณด๋ฌผ์ ์๋ ํ์๋ ๋ ๊ณณ์ ๋ฌปํ ์๊ฒ ๋๊ณ , ์ด ๋ ์ฌ์ด์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ก ์ด๋ํ๋ ์๊ฐ์ 8์๊ฐ์ด ๋๋ค.
๋ณด๋ฌผ ์ง๋๊ฐ ์ฃผ์ด์ง ๋, ๋ณด๋ฌผ์ด ๋ฌปํ ์๋ ๋ ๊ณณ ๊ฐ์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ก ์ด๋ํ๋ ์๊ฐ์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์๋ ๋ณด๋ฌผ ์ง๋์ ์ธ๋ก์ ํฌ๊ธฐ์ ๊ฐ๋ก์ ํฌ๊ธฐ๊ฐ ๋น์นธ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง๋ค. ์ด์ด L๊ณผ W๋ก ํ์๋ ๋ณด๋ฌผ ์ง๋๊ฐ ์๋์ ์์ ๊ฐ์ด ์ฃผ์ด์ง๋ฉฐ, ๊ฐ ๋ฌธ์ ์ฌ์ด์๋ ๋น ์นธ์ด ์๋ค. ๋ณด๋ฌผ ์ง๋์ ๊ฐ๋ก, ์ธ๋ก์ ํฌ๊ธฐ๋ ๊ฐ๊ฐ 50์ดํ์ด๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ๋ณด๋ฌผ์ด ๋ฌปํ ์๋ ๋ ๊ณณ ์ฌ์ด๋ฅผ ์ต๋จ ๊ฑฐ๋ฆฌ๋ก ์ด๋ํ๋ ์๊ฐ์ ์ถ๋ ฅํ๋ค.
์์
์ ๋ ฅ
5 7
WLLWWWL
LLLWLLL
LWLWLWW
LWLWLLL
WLLWLWW
์ถ๋ ฅ
8
My Sol
import sys
input = sys.stdin.readline
def BFS(i, j):
visited = [[0]*J for _ in range(I)]
didj = [(-1,0),(1,0),(0,1),(0,-1)]
visited[i][j] = 1
Q = [(i, j)]
front = -1
rear = 0
max_now = 0
while front < rear:
front += 1
ni, nj = Q[front]
for di, dj in didj:
si, sj = ni+di, nj+dj
if not (0<=si<I and 0<=sj<J): continue
if visited[si][sj]: continue
if not mat[si][sj]: continue
visited[si][sj] = visited[ni][nj]+1
max_now = max(visited[si][sj], max_now)
Q.append((si, sj))
rear += 1
return max_now-1
I, J = map(int, input().split())
mat = []
for _ in range(I):
l = [1 if i=='L' else 0 for i in list(input())]
mat.append(l)
max_val = 0
for i in range(I):
for j in range(J):
if not mat[i][j]: continue
val = BFS(i, j)
if max_val < val:
max_val = val
print(max_val)
BFS๋ฅผ ์ด์ฉํ๋ ๋ฌธ์ ์๋ค. ์์ ํ์์ ์ด์ฉํด ์ ์ฒด ์นธ์ ๋ํด ์กฐํํ๋๋ฐ ๋ง์ฝ โLโ ์นธ์ ๋ง๋๋ฉด ์ํ์ข์ฐ์ ๊ฐ์ฅ ์ธ์ ํ ์นธ๋ง๋ค ์๊ฐ์ ๋ํด๊ฐ๋ฉฐ ์ฑ์ฐ๋ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋ค๊ฐ ์ฑ์ธ ์ ์๋ ์นธ์ ๋ง์ง๋ง ์นธ์ ๊ฐ์ ๋งค๋ฒ ์ต๋๊ฐ๊ณผ ๋น๊ตํ๋ฉฐ ์์ ํ์์ ๋ง์น๋ฉด ํด๋น ์ต๋๊ฐ์ด ์ง๋์์ ๊ฐ์ฅ ๊ฐ ์ ์๋ ์ ์ผ ๋จผ ๊ณณ๊น์ง์ ์์ ์๊ฐ์ด ๋๋ค.
๊ฒฐ๊ณผ
๋ง์์ต๋๋ค!!
๋ชจ๋ฒ๋ต์
import sys, collections
n, m = [int(x) for x in sys.stdin.readline().split()]
board = [list(sys.stdin.readline().rstrip()) for _ in range(n)]
dx, dy = (1, -1, 0, 0), (0, 0, 1, -1)
def bfs(x, y):
q = collections.deque([(x, y)])
visited = [[0]*m for _ in range(n)]
visited[x][y] = 1
mx = 0
while q:
x, y = q.popleft()
for i in range(4):
nx, ny = x+dx[i], y+dy[i]
if not (0 <= nx < n and 0 <= ny < m) or visited[nx][ny] != 0 or board[nx][ny] == "W": continue
visited[nx][ny] = visited[x][y] + 1
mx = max(visited[nx][ny], mx)
q.append((nx, ny))
return mx-1
result = 0
for i in range(n):
for j in range(m):
if board[i][j] == "L":
if 0 <= i-1 and i+1 < n:
if board[i-1][j] == 'L' and board[i+1][j] == 'L': continue
if 0 <= j-1 and j+1 < m:
if board[i][j-1] == 'L' and board[i][j+1] == 'L': continue
result = max(result, bfs(i, j))
print(result)
์ฐ์ฐ ์๊ฐ์ด ์งง์ ๋ต์ด ์์ด์ ๊ฐ์ ธ์ ๋ณด์๋ค. ์์ ํ์์ ํ๋ ๊ฒฝ์ฐ๋ฅผ ๊ฐ์ง์น๊ธฐํด์ฃผ์๋๋ฐ, ์ฌ๋ฐฉ์ด ์ก์ง์ธ ๊ณณ๋ถํฐ๋ ์ ๋ ์ต๋๊ธธ์ด๊ฐ ๋์ฌ ์ ์๋ ์ ์ ์ด์ฉํด์ bfs๋ฅผ ์์ํ ๋ ์ํ์ข์ฐ ๋ชจ๋ โLโ ์๋ค๋ฉด ์ ์ธํ๊ณ ์์ํ๋ ๊ฒ์ด๋ค. ๋๋ํ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ์๊ฐํ๋ค.
๋๊ธ๋จ๊ธฐ๊ธฐ