๋ฌธ์
์ ๋ช ํ ์ ๋นต์ฌ ๊น์์ ์ ๋นต์ง์ ์ด์ํ๊ณ ์๋ค. ์์ ์ด์ ๋นต์ง์ ๊ธ๋ก๋ฒ ์ฌ์ ์๊ธฐ๋ฅผ ํผํด๊ฐ์ง ๋ชปํ๊ณ , ๊ฒฐ๊ตญ ์ฌ๊ฐํ ์ฌ์ ์๊ธฐ์ ๋น ์ก๋ค.
์์ ์ด๋ ์ง์ถ์ ์ค์ด๊ณ ์ ์ฌ๊ธฐ์ ๊ธฐ ์ง์ถ์ ์ดํด๋ณด๋ ์ค์, ๊ฐ์ค๋น๊ฐ ์ ์ผ ํฌ๋ค๋ ๊ฒ์ ์๊ฒ๋์๋ค. ๋ฐ๋ผ์ ์์ ์ด๋ ๊ทผ์ฒ ๋นต์ง์ ๊ฐ์ค๊ด์ ๋ชฐ๋ ํ์ดํ๋ฅผ ์ค์นํด ํ์ณ์ ์ฌ์ฉํ๊ธฐ๋ก ํ๋ค.
๋นต์ง์ด ์๋ ๊ณณ์ R*C ๊ฒฉ์๋ก ํํํ ์ ์๋ค. ์ฒซ์งธ ์ด์ ๊ทผ์ฒ ๋นต์ง์ ๊ฐ์ค๊ด์ด๊ณ , ๋ง์ง๋ง ์ด์ ์์ ์ด์ ๋นต์ง์ด๋ค.
์์ ์ด๋ ๊ฐ์ค๊ด๊ณผ ๋นต์ง์ ์ฐ๊ฒฐํ๋ ํ์ดํ๋ฅผ ์ค์นํ๋ ค๊ณ ํ๋ค. ๋นต์ง๊ณผ ๊ฐ์ค๊ด ์ฌ์ด์๋ ๊ฑด๋ฌผ์ด ์์ ์๋ ์๋ค. ๊ฑด๋ฌผ์ด ์๋ ๊ฒฝ์ฐ์๋ ํ์ดํ๋ฅผ ๋์ ์ ์๋ค.
๊ฐ์ค๊ด๊ณผ ๋นต์ง์ ์ฐ๊ฒฐํ๋ ๋ชจ๋ ํ์ดํ๋ผ์ธ์ ์ฒซ์งธ ์ด์์ ์์ํด์ผ ํ๊ณ , ๋ง์ง๋ง ์ด์์ ๋๋์ผ ํ๋ค. ๊ฐ ์นธ์ ์ค๋ฅธ์ชฝ, ์ค๋ฅธ์ชฝ ์ ๋๊ฐ์ , ์ค๋ฅธ์ชฝ ์๋ ๋๊ฐ์ ์ผ๋ก ์ฐ๊ฒฐํ ์ ์๊ณ , ๊ฐ ์นธ์ ์ค์ฌ๋ผ๋ฆฌ ์ฐ๊ฒฐํ๋ ๊ฒ์ด๋ค.
์์ ์ด๋ ๊ฐ์ค๋ฅผ ๋๋๋ก ๋ง์ด ํ์น๋ ค๊ณ ํ๋ค. ๋ฐ๋ผ์, ๊ฐ์ค๊ด๊ณผ ๋นต์ง์ ์ฐ๊ฒฐํ๋ ํ์ดํ๋ผ์ธ์ ์ฌ๋ฌ ๊ฐ ์ค์นํ ๊ฒ์ด๋ค. ์ด ๊ฒฝ๋ก๋ ๊ฒน์น ์ ์๊ณ , ์๋ก ์ ํ ์๋ ์๋ค. ์ฆ, ๊ฐ ์นธ์ ์ง๋๋ ํ์ดํ๋ ํ๋์ด์ด์ผ ํ๋ค.
์์ ์ด ๋นต์ง์ ๋ชจ์ต์ด ์ฃผ์ด์ก์ ๋, ์์ ์ด๊ฐ ์ค์นํ ์ ์๋ ๊ฐ์ค๊ด๊ณผ ๋นต์ง์ ์ฐ๊ฒฐํ๋ ํ์ดํ๋ผ์ธ์ ์ต๋ ๊ฐ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ R๊ณผ C๊ฐ ์ฃผ์ด์ง๋ค. (1 ≤ R ≤ 10,000, 5 ≤ C ≤ 500)
๋ค์ R๊ฐ ์ค์๋ ๋นต์ง ๊ทผ์ฒ์ ๋ชจ์ต์ด ์ฃผ์ด์ง๋ค. '.'๋ ๋น ์นธ์ด๊ณ , 'x'๋ ๊ฑด๋ฌผ์ด๋ค. ์ฒ์๊ณผ ๋ง์ง๋ง ์ด์ ํญ์ ๋น์ด์๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ์์ ์ด๊ฐ ๋์ ์ ์๋ ํ์ดํ๋ผ์ธ์ ์ต๋ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ค.
https://www.acmicpc.net/problem/3109
๐ก ํ์ด ๋ฐ ์ฝ๋
r, c = map(int, input().split())
data = []
for _ in range(r):
data.append(list(input()))
def dfs(array, x, y, visited):
global pipe
if y == c-2:
pipe = array
return
for i in range(3):
nx = x + dx[i]
if 0 <= nx and nx < r and not visited[nx][y+1] and data[nx][y+1] == '.' :
visited[nx][y+1] = 1
dfs(array + [(nx, y+1)], nx, y+1, visited)
if len(pipe) == c-2:
break
visited = [[0]*c for _ in range(r)]
dx = [-1, 0, 1]
result = 0
for i in range(r):
pipe = []
if data[i][1] == '.':
visited[i][1] = 1
dfs([(i, 1)], i, 1, visited)
if pipe:
for x, y in pipe:
data[x][y] = 'P'
result += 1
print(result)
๋งจ ์ฒ์ ํ์ดํ ์ฝ๋์ด๋ค. ๊ฐ ์ด์์ ์ถ๋ฐํ์ฌ ๊ฐ์ฅ ์ฒซ๋ฒ ์งธํ๊ณผ ์ต๋ํ ๊ฐ๊น์ด ๊ธธ์ ์ ํํ๋ ๊ทธ๋ฆฌ๋ ๋ฌธ์ ์ด๋ค. ๊ธธ ํ์์ ์ํด์๋ DFS๋ฅผ ์ฌ์ฉํ์๋ค.
ํ ์คํธ์ผ์ด์ค๋ ๋ชจ๋ ๋ง์ถ์์ง๋ง ์ ์ถ ์ ์๊ฐ์ด๊ณผ๊ฐ ๋ด๋ค. ํ ์ง๋ฌธ ๊ธ์์ ํด๋ต์ ์ฐพ์ ์ ์์๋ค. visited ํ ์ด๋ธ์ ๋ง๋ค์ด์ ์ด์ ์ ํ์ํ ๊ธธ์ ๋ค์ ํ์ํ์ง ์๋๋ก ํด์ผํ๋ค.
r, c = map(int, input().split())
data = []
for _ in range(r):
data.append(list(input()))
def dfs(array, x, y):
if y == c-2:
return True
data[x][y] = 'P'
for i in range(3):
nx = x + dx[i]
if 0 <= nx and nx < r and data[nx][y+1] == '.' :
if dfs(array + [(nx, y+1)], nx, y+1):
return True
return False
dx = [-1, 0, 1]
result = 0
for i in range(r):
if data[i][1] == '.':
if dfs([(i, 1)], i, 1):
result += 1
print(result)
๋ค๋ฅธ ๋ธ๋ก๊ทธ ํ์ด ๊ธ์ ๋ณด๊ณ ์ฝ๋๋ฅผ ๊ฐ์ ํด๋ณด์๋ค. ์ด์ ์ฒ๋ผ ํ์ดํ๋ฅผ ๋์ ์ ์๋ ๊ฒฝ๋ก์ ๋ํด์๋ง data ๊ฐ์ ๋ณ๊ฒฝํด์ฃผ์ง ์๊ณ ํ์ ์๋ง๋ค ๋ฌด์กฐ๊ฑด data ๊ฐ์ ๋ณ๊ฒฝํด์ค๋ค๋ฉด ๊ธธ ํ์๊ณผ ๋ฐฉ๋ฌธํ์ธ์ ๋์์ ํ๋ ํจ๊ณผ๋ฅผ ์ค ์ ์์๋ค. visited ํ ์ด๋ธ์ ์์ ๊ณ data์ ์ง์ ๋ฐฉ๋ฌธ์ ํ์๋ฅผ ํ๋ฉด์, ํ์ดํ๋ฅผ ๋์ ์ ์๋์ง ์ฌ๋ถ๋ return ๊ฐ์ ํตํด ์ ์ ์๋๋ก ํ๋ค.
'Algorithm > ๐ Baekjoon Judge' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ] ๋ฐฑ์ค 2206๋ฒ ๋ฒฝ ๋ถ์๊ณ ์ด๋ํ๊ธฐ - ํ์ด์ฌ(Python) (0) | 2022.07.27 |
---|---|
[BOJ] ๋ฐฑ์ค 12904๋ฒ A์ B - ํ์ด์ฌ(Python) (0) | 2022.07.06 |
[BOJ] ๋ฐฑ์ค 1781๋ฒ ์ปต๋ผ๋ฉด - ํ์ด์ฌ(Python) (0) | 2022.07.04 |
[BOJ] ๋ฐฑ์ค 8980๋ฒ ํ๋ฐฐ - ํ์ด์ฌ(Python) (0) | 2022.07.04 |
[BOJ] ๋ฐฑ์ค 15683๋ฒ ๊ฐ์ - ํ์ด์ฌ(Python) (0) | 2022.04.04 |