๐ฉ๐ปโ๐ป๋ฌธ์ ๋งํฌ
[๋ฐฑ์ค 7576] ํ ๋งํ (Python)
โ๏ธIdea Sketch
2021-08-02
1. ์์ ์ถ๋ ฅ๊ฐ
1) ์ฒ์๋ถํฐ ๋ชจ๋ ์ต์ ๊ฒฝ์ฐ, ์ฆ ์
๋ ฅ๊ฐ์ 0์ด ์๋ ๊ฒฝ์ฐ์๋ 0์ ์ถ๋ ฅํ๋ค.
2) 0์ด ๋ชจ๋ 1์ด ๋๊ธฐ๊น์ง ๊ฑธ๋ฆฌ๋ ์ต์ ๋ ์ง๋ฅผ ์ถ๋ ฅํ๋ค.
3) ๋ชจ๋ ์ต์ง๋ ๋ชปํ๋ ๊ฒฝ์ฐ, ์ฆ ๋ชจ๋ ์ฐ์ฐ์ด ๋๋ ํ์๋ 0์ด ๋จ์์๋ ๊ฒฝ์ฐ์๋ -1์ ์ถ๋ ฅํ๋ค.
2. main ๋ก์ง
- ์ ๋ ฅ๊ฐ์ ๋ฐ์ graph ์ ์ ๋ฆฌํ๋ค.
- ์ต์ ํ ๋งํ ์ x, y ์ธ๋ฑ์ค๋ฅผ queue์ ์ ์ฅํ๋ค.
- queue์ ์ฒซ๋ฒ์งธ ์์ x, y๋ฅผ popํ๋ค.
- dfs ์ฐ์ฐ์ ํ๊ธฐ ์ํด ๋ฐฉ๋ฌธ์ฌ๋ถ๋ฅผ ์ด๊ธฐํํ๋ค. (visited[y][x] = 0)
- dfs(x, y) ํจ์๋ฅผ ํธ์ถํ๋ค.
3. DFS ๋ก์ง
- ๊ฒฝ๊ณ๊ฐ์ ๋ถ์ํ๋ค.
- ์ฒ์ ๋ฐฉ๋ฌธํ๋ฉด์
1) ์ต์ ํ ๋งํ ์ผ ๊ฒฝ์ฐ, ์ํ์ข์ฐ ์ธ์ ํ ๊ณณ์ ์๋ ํ ๋งํ ์๊ฒ ์ํฅ์ ๋ผ์น๋ค.
2) ์ต์ง ์๋ ํ ๋งํ ์ผ ๊ฒฝ์ฐ ์ต์ผ๋ฉฐ, ์ด ํ ๋งํ ์ x, y ์ธ๋ฑ์ค๋ฅผ queue์ ์ถ๊ฐํ๋ค.
โ๏ธ์์ค์ฝ๋
2021-08-02 3528ms ํต๊ณผ
- ๋ ํจ์จ์ ์ธ ๋ก์ง ์กด์ฌ
from collections import deque
import sys
sys.setrecursionlimit(10**6)
def dfs(x, y):
if (0<=x<m) and (0<=y<n) and visited[y][x] == 0:
visited[y][x] = 1
if graph[y][x] == 1:
dfs(x, y-1)
dfs(x, y+1)
dfs(x-1, y)
dfs(x+1, y)
if graph[y][x] == 0:
graph[y][x] = 1
queue_x.append(x)
queue_y.append(y)
return True
if __name__ == "__main__":
m, n = map(int, input().split())
graph = [list(map(int, sys.stdin.readline().rstrip().split())) for _ in range(n)]
visited = [[0 for _ in range(m)] for _ in range(n)]
queue_x = deque([])
queue_y = deque([])
flag_0 = False
for i in range(n):
if 1 in graph[i]:
for j in range(m):
if graph[i][j] == 1:
queue_x.append(j)
queue_y.append(i)
if 0 in graph[i]:
flag_0 = True
if flag_0 == False: #1 : ์ฒ์๋ถํฐ 0์ด ํ๋๋ ์๋ ๊ฒฝ์ฐ
print(0)
sys.exit(0)
result = 0 #2 : 0์ด ๋ชจ๋ 1์ด ๋๊ธฐ๊น์ง ์ต์ ์์ ๋ ์ง
while len(queue_x) != 0:
l = len(queue_x)
for _ in range(l):
x = queue_x.popleft()
y = queue_y.popleft()
visited[y][x] = 0
dfs(x, y)
result += 1
for i in graph: #3 : ์ฐ์ฐ ํ์๋ 0์ด ๋จ์์๋ ๊ฒฝ์ฐ
if 0 in i:
print(-1)
sys.exit(0)
print(result-1)