‘flag๋ฅผ ์ด๋์ ์ธ์ธ ๊ฒ์ธ์ง’์ ๋ฐ๋ผ ์๊ฐ ๋ณต์ก๋๊ฐ N์ ์ ๊ณฑ๋งํผ ์ฐจ์ด๊ฐ ๋ฌ๋ค. ํ์ฌ ๋ฌธ์ ์์ N์ ์ต๋ 100์ด๋ฏ๋ก TLE๊ฐ ๋ฐ์ํ๋์ง ์ ํ๋์ง ์ฐจ์ด๋ฅผ ๋ด๋ ์ค์ํ ์์ธ์ด์๋ค.
2638๋ฒ: ์น์ฆ
boj.ma
๋ฌธ์ ์์ฝ
์ซ์ 1๋ก ํํ๋ ์น์ฆ๊ฐ ๋ช ๋ฒ์ ์ฐ์ฐ ํ์ ๋ชจ๋ ๋ น์์ง ๊ตฌํ๋ ๋ฌธ์ ์ด๋ค. ์น์ฆ(์ซ์ 1)๋ ์ฃผ๋ณ์ ์ซ์ 0์ด 2๊ฐ ์ด์ ์๋ ๊ฒฝ์ฐ ํด๋น ์ฐ์ฐ์์ ๋ น๊ฒ ๋๋ค. ๋ค๋ง, ์ซ์ 0 ์ค ์น์ฆ์ ๋๋ฌ์ธ์ธ ๊ฒ์ ์ ์ธํ๋ค๋ ์กฐ๊ฑด์ด ์์ด ๋ค์ ๊น๋ค๋กญ๋ค.
1ํธ: counting๋๋ฉด ์ ๋๋ ์์ญ์ ํ์ํ๋ค
์ซ์ 1์ด ๋ชจ๋ ์ซ์ 0๊ณผ ๋ง๋ฟ๋ ๊ฒฝ์ฐ๋ฅผ ์ผ๋ค๋ฉด ์ฌ์ด ๋ฌธ์ ์๊ฒ ์ง๋ง, ์ซ์ 1๋ก ๋ง๋ค์ด์ง ์์ญ ๋ด์ ํฌํจ๋ ์ซ์ 0์ counting ํ์ง ์์์ผ ํ์ฌ ๊น๋ค๋ก์ด ๋ฌธ์ ๊ฐ ๋์๋ค.
์ซ์ 1๋ก ๋ง๋ค์ด์ง ์์ญ ๋ด์ ์ซ์ 0์ ์ซ์ 2๋ก ํ ๋นํ์ฌ counting ๋๋ฉด ์ ๋๋ ์์ญ์ผ๋ก ํ์ํ์๋ค. ์ด ์์ญ์ ํ์ํ ๋๋ BFS๋ฅผ ์ฌ์ฉํ์๋ค.
for i in range(1, N-1):
for j in range(1, M-1):
if original_matrix[i][j] == 1: isStop = False
if original_matrix[i][j] == 0 and vis[i][j] == 0:
isInside = [True]
vis[i][j] = 1
bfs(i, j)
deleteOuter() // ์ฃผ๋ณ์ ์ซ์ 0 ๊ฐ์๋ฅผ ์ธ์ ์ซ์ 1 ์ค ์ง์ธ ์ ์๋ ๊ฒ์ ์ง์ด๋ค
- ์ํํ๋ฉฐ BFS๋ฅผ ์ ์ฉํ๋ ์ฝ๋
def bfs(i, j):
qu.append([i, j])
while qu:
i, j = qu.popleft()
dx = [1, -1, 0, 0]
dy = [0, 0, 1, -1]
for k in range(4):
nx = i + dx[k]
ny = j + dy[k]
if 0 <= nx and nx < N and 0 <= ny and ny < M:
if original_matrix[nx][ny] == 0:
qu.append([nx, ny])
original_matrix[nx][ny] = 2
BFS๋ง ์ฐ์ฐํ๋ฉด ๊ด์ฐฎ์๊ฒ ์ง๋ง, BFS๋ฅผ ํ๊ณ ์๋ ๋ ๊ฐ์ ๋ฐ๋ณต๋ฌธ์ด ๋ฌธ์ ๊ฐ ๋์๋ค. ํด๋น ์ํ๊ฐ ํ์ํ ์ด์ ๋ BFS๋ฅผ ์์ํด์ผ ํ๋ ์์ญ์ ์ํ ์์ด ํน์ ํ๊ธฐ ์ด๋ ค์ ๊ธฐ ๋๋ฌธ์ด๋ค. ์ฆ, ๋ชจ๋ ์ง์ ์์ BFS๋ฅผ ํตํด ์ซ์ 1 ์์ญ์ ํฌํจ๋ ์ซ์ 0์ธ์ง ํ๋จํ ๊ฒ์ด๋ค.
์ด ๊ฒฝ์ฐ ์๊ฐ ๋ณต์ก๋๋ O(NMO(BFS)) = O(NMN*M)์ผ๋ก N, M ≤ 100์ผ ๋ TLE๊ฐ ๋ฐ์ํ๋ค!
2ํธ: counting๋์ด์ผ ํ๋ ์์ญ์ ํ์ํ๋ค
ํญ์ ์ซ์ 0์ธ ์ง์ (0, 0)๋ถํฐ BFS๋ก counting ๋์ด์ผ ํ๋ ์์ญ์ ํ์ํ๋ค. ์ด ์์ญ์ ํ์ํ ๋๋ BFS๋ฅผ ์ฌ์ฉํ์๋ค.
vis = [[0 for _ in range(M)] for _ in range(N)]
vis[0][0] = 1
bfs(0, 0)
deleteOuter()
ํญ์ ์ซ์ 0์ธ (0, 0)์ง์ ์์ BFS๋ฅผ ์ํํ ๊ฒฝ์ฐ ์ซ์ 1๋ก ๋ง๋ค์ด์ง ์์ญ ๋ด์ ํฌํจ๋ ์ซ์ 0์๋ ํ์๋์ง ์๊ฒ ๋๋ค(์ BFS ํจ์ ์ฐธ๊ณ ).
์ด๋ ๊ฒ BFS๋ฅผ ํตํด counting๋์ด์ผ ํ๋ ์์ญ์ 2๋ฅผ ํ์ํด ๋๊ณ , deleteOuter() ํจ์์์ ์ซ์ 2์ ๊ฐ์๋ฅผ counting ํ์ฌ ์ญ์ ํ ์ซ์ 1์ ๊ฒฐ์ ํ๋ค.
์ด ๊ฒฝ์ฐ ์๊ฐ ๋ณต์ก๋๋ O(O(BFS)) = O(N*M)์ผ๋ก N, M ≤ 100์ผ ๋ ์ถฉ๋ถํ ์ฐ์ฐ ๊ฐ๋ฅํ ์์ค์ด๋ค.
(์ฐธ๊ณ ) ์ซ์ 1์ ์ญ์ ํ๋ ์๊ฐ ๊ฒฐ์
‘1ํธ’ ๊ฒฝ์ฐ์ ์ซ์ 0์ด ์ฃผ๋ณ์ ๋ช ๊ฐ๊ฐ ์๋์ง countingํ๊ฒ ๋๋ค. Counting ํ ๊ณง๋ฐ๋ก ์ซ์ 1์ 0์ผ๋ก ๋ฐ๊พธ๋ฉด ๋ค๋ฅธ ์ซ์ 1์ ์ฃผ๋ณ์ ์ซ์ 0์ด ๋ช ๊ฐ๊ฐ ์๋์ง counting ํ ๋, ์ง์ ์ ๋ฐ๊ฟจ๋ ๊ฐ์ด ๋ฐ์๋๋ค.
์ด๋ฐ ๊ฒฝ์ฐ ๋ณดํต ๋ฐฉ๋ฌธ ์ด๋ ฅ ํ์ ๋ณ์์ ํน์ ๊ฐ์ ํ ๋นํ์ฌ ๋ชจ๋ ์ซ์ 1์ ๋ํด counting์ ๋๋ธ ํ์์์ผ ์ซ์ 1์ 0์ผ๋ก ๋ฐ๊พธ๋ ์์ ์ ์ํํ๋ค.
‘2ํธ’์ ๊ฒฝ์ฐ ‘2’์ ๊ฐ์๋ฅผ countingํ์ฌ ์กฐ๊ฑด์ ๋ง์กฑํ๋์ง ํ์ธํ๋ ๊ฒ์ผ๋ก ๋ฐ๋์๊ธฐ ๋๋ฌธ์ ๊ณง๋ฐ๋ก ์ซ์ 1์ 0์ผ๋ก ๋ฐ๊พธ์ด๋ ๋ฌด๋ฐฉํ์๋ค.