๋ฌธ์ (์ถ์ฒ: https://www.acmicpc.net/problem/2638)
<์น์ฆ>
๋ฌธ์
N×M์ ๋ชจ๋์ข ์ด ์์ ์์ฃผ ์์ ์น์ฆ๊ฐ <๊ทธ๋ฆผ 1>๊ณผ ๊ฐ์ด ํ์๋์ด ์๋ค. ๋จ, N ์ ์ธ๋ก ๊ฒฉ์์ ์์ด๊ณ , M ์ ๊ฐ๋ก ๊ฒฉ์์ ์์ด๋ค. ์ด ์น์ฆ๋ ๋๋ ๋ณด๊ด์ ํด์ผ๋ง ํ๋๋ฐ ์ค๋ด์จ๋์ ๋ด์ด๋์ผ๋ฉด ๊ณต๊ธฐ์ ์ ์ดํ์ฌ ์ฒ์ฒํ ๋ น๋๋ค. ๊ทธ๋ฐ๋ฐ ์ด๋ฌํ ๋ชจ๋์ข ์ด ๋ชจ์์ ์น์ฆ์์ ๊ฐ ์น์ฆ ๊ฒฉ์(์ ์ ์ ์ฌ๊ฐํ ๋ชจ์)์ 4 ๋ณ ์ค์์ ์ ์ด๋ 2 ๋ณ ์ด์์ด ์ค๋ด์จ๋์ ๊ณต๊ธฐ์ ์ ์ดํ ๊ฒ์ ์ ํํ ํ ์๊ฐ ๋ง์ ๋ น์ ์์ด์ ธ ๋ฒ๋ฆฐ๋ค. ๋ฐ๋ผ์ ์๋ <๊ทธ๋ฆผ 1> ๋ชจ์๊ณผ ๊ฐ์ ์น์ฆ(ํ์์ผ๋ก ํ์๋ ๋ถ๋ถ)๋ผ๋ฉด C๋ก ํ์๋ ๋ชจ๋ ์น์ฆ ๊ฒฉ์๋ ํ ์๊ฐ ํ์ ์ฌ๋ผ์ง๋ค.
<๊ทธ๋ฆผ 2>์ ๊ฐ์ด ์น์ฆ ๋ด๋ถ์ ์๋ ๊ณต๊ฐ์ ์น์ฆ ์ธ๋ถ ๊ณต๊ธฐ์ ์ ์ดํ์ง ์๋ ๊ฒ์ผ๋ก ๊ฐ์ ํ๋ค. ๊ทธ๋ฌ๋ฏ๋ก ์ด ๊ณต๊ฐ์ ์ ์ดํ ์น์ฆ ๊ฒฉ์๋ ๋ น์ง ์๊ณ C๋ก ํ์๋ ์น์ฆ ๊ฒฉ์๋ง ์ฌ๋ผ์ง๋ค. ๊ทธ๋ฌ๋ ํ ์๊ฐ ํ, ์ด ๊ณต๊ฐ์ผ๋ก ์ธ๋ถ ๊ณต๊ธฐ๊ฐ ์ ์ ๋๋ฉด <๊ทธ๋ฆผ 3>์์์ ๊ฐ์ด C๋ก ํ์๋ ์น์ฆ ๊ฒฉ์๋ค์ด ์ฌ๋ผ์ง๊ฒ ๋๋ค.
๋ชจ๋์ข ์ด์ ๋งจ ๊ฐ์ฅ์๋ฆฌ์๋ ์น์ฆ๊ฐ ๋์ด์ง ์๋ ๊ฒ์ผ๋ก ๊ฐ์ ํ๋ค. ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง ์น์ฆ๊ฐ ๋ชจ๋ ๋ น์ ์์ด์ง๋๋ฐ ๊ฑธ๋ฆฌ๋ ์ ํํ ์๊ฐ์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์๋ ๋ชจ๋์ข ์ด์ ํฌ๊ธฐ๋ฅผ ๋ํ๋ด๋ ๋ ๊ฐ์ ์ ์ N, M (5 ≤ N, M ≤ 100)์ด ์ฃผ์ด์ง๋ค. ๊ทธ๋ค์ N๊ฐ์ ์ค์๋ ๋ชจ๋์ข ์ด ์์ ๊ฒฉ์์ ์น์ฆ๊ฐ ์๋ ๋ถ๋ถ์ 1๋ก ํ์๋๊ณ , ์น์ฆ๊ฐ ์๋ ๋ถ๋ถ์ 0์ผ๋ก ํ์๋๋ค. ๋ํ, ๊ฐ 0๊ณผ 1์ ํ๋์ ๊ณต๋ฐฑ์ผ๋ก ๋ถ๋ฆฌ๋์ด ์๋ค.
์ถ๋ ฅ
์ถ๋ ฅ์ผ๋ก๋ ์ฃผ์ด์ง ์น์ฆ๊ฐ ๋ชจ๋ ๋ น์ ์์ด์ง๋๋ฐ ๊ฑธ๋ฆฌ๋ ์ ํํ ์๊ฐ์ ์ ์๋ก ์ฒซ ์ค์ ์ถ๋ ฅํ๋ค.
๋ฌธ์ ํ์ด
- my solution (Python)
import sys
from collections import deque
def cheese(arr,queue,visited,cheese_temp):
cheese_cnt = [[0] * m for i in range(n)] # ๊ณต๊ธฐ์ ์ ์ดํ ๋ณ ๊ฐ์
dx=[-1,1,0,0] # ์ํ์ข์ฐ
dy=[0,0,-1,1]
while queue:
temp=queue.popleft()
for i in range(4):
x=temp[0]+dx[i]
y=temp[1]+dy[i]
if 0<=x<len(arr) and 0<=y<len(arr[0]): # ๋ฒ์ ์
if arr[x][y]==0 and visited[x][y]==0: # ๊ณต๊ธฐ - ๋ฐฉ๋ฌธ x
visited[x][y]=1
queue.append([x,y])
elif arr[x][y]==1: # ์น์ฆ
if visited[x][y]==0: # ๋ฐฉ๋ฌธ x
cheese_cnt[x][y]+=1
visited[x][y] = 1
else: # ์น์ฆ - ๊ณต๊ธฐ 2๋ณ ์ด์
cheese_temp.append([x,y])
return cheese_temp
if __name__=='__main__':
n,m=map(int,sys.stdin.readline().split())
arr=[]
for i in range(n):
arr.append(list(map(int,sys.stdin.readline().split())))
visited=[[0]*m for i in range(n)] # ๋ฐฉ๋ฌธ ์ฌ๋ถ
queue=deque([[0,0]])
cheese_temp=deque([])
visited[0][0] = 1
day=0
cheese_temp=cheese(arr,queue,visited,cheese_temp)
for i in cheese_temp: # ์น์ฆ -> ๊ณต๊ธฐ
arr[i[0]][i[1]]=0
while cheese_temp:
day+=1
cheese_temp = cheese(arr, cheese_temp, visited, deque([]))
for i in cheese_temp:
arr[i[0]][i[1]] = 0
print(day)
์ํ์ข์ฐ๋ฅผ ํ์ธํ์ฌ ๊ณต๊ธฐ์ด๋ฉฐ ์์ง ๋ฐฉ๋ฌธํ์ง ์์์ผ๋ฉด ๋ฐฉ๋ฌธ ํ์๋ฅผ ํ๋ฉฐ ๊ณ์ํด์ ํ์ํด์ค๋๋ค.
๋ง์ฝ ์น์ฆ์ด๋ฉฐ ์์ง ๋ฐฉ๋ฌธํ์ง ์์์ผ๋ฉด ๊ณต๊ธฐ์ ์ ์ดํ ๋ณ +1์ ํด์ค๋๋ค. ์น์ฆ์ธ๋ฐ ๋ฐฉ๋ฌธํ์๋ค๋ฉด ๊ณต๊ธฐ์ ์ ์ดํ ๋ณ์ด 2 ๋ณ ์ด์์ด๋ผ๋ ๋ป์ด๋ฏ๋ก ๋ น์ ์น์ฆ ๋ชฉ๋ก์ ์ถ๊ฐํด์ค๋๋ค.
- cheese( ์
๋ ฅ ์ ๋ณด, queue, ๋ฐฉ๋ฌธ ์ฌ๋ถ, ๋
น์ ์น์ฆ ์ ์ฅ )
: cheese_cnt = ๊ณต๊ธฐ์ ์ ์ดํ ๋ณ ๊ฐ์ ์ ์ฅ
: ์ํ์ข์ฐ๋ฅผ ํ์ํ์ฌ ๊ทธ ๊ฐ์ด ๊ณต๊ธฐ์ด๋ฉฐ ์์ง ๋ฐฉ๋ฌธํ์ง ์์ ๊ณณ์ด๋ผ๋ฉด ๋ฐฉ๋ฌธ ํ์ ๋ฐ ๊ณ์ํด์ ํ์. ๊ทธ ๊ฐ์ด ์น์ฆ์ด๋ฉฐ ์์ง ๋ฐฉ๋ฌธํ์ง ์์๋ค๋ฉด ๋ฐฉ๋ฌธ ํ์ ๋ฐ ๊ณต๊ธฐ์ ์ ์ดํ ๋ณ์ +1๋ก ์ ์ฅ. ๋ฐฉ๋ฌธํ๋ ๊ณณ์ด๋ผ๋ฉด ๊ณต๊ธฐ์ ์ ์ดํ ๋ณ์ด 2 ๋ณ ์ด์์ด๋ผ๋ ๋ป์ด๋ฏ๋ก ๋ น์ ์น์ฆ ๋ชฉ๋ก์ ์ ์ฅ
: cheese_temp = ๋ น์ ์น์ฆ ๋ชฉ๋ก ๋ฐํ - Main
: ๊ฐ๋ก, ์ธ๋ก ํฌ๊ธฐ ์ ๋ ฅ
: arr ์ ๋ณด ์ ๋ ฅ
: visited = ๋ฐฉ๋ฌธ ์ฌ๋ถ
: cheese_temp = ๋ น์ ์น์ฆ ์ ์ฅ ( ํ ๋ฒ์ ๋ น์์ผ ํ๋ฏ๋ก ๋ฐ๋ก ์ ์ฅํด๋๋ค๊ฐ ์น์ฆ -> ๊ณต๊ธฐ๋ก ๋ฐ๊ฟ์ค )
: ๋ น์ ์น์ฆ๊ฐ ๋ ์ด์ ์์ ๋๊น์ง ๋ฐ๋ณต -> ์๊ฐ +1 , ํจ์ ํธ์ถ ๋ฐ ( ์น์ฆ -> ๊ณต๊ธฐ ) ๋ณํ
: ๋ชจ๋ ๋ น์ ์์ด์ง๋๋ฐ ๊ฑธ๋ฆฌ๋ ์ ํํ ์๊ฐ ์ถ๋ ฅ
์๊ฐ๐ค
์ด ๋ฌธ์ ์ ๋น์ทํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด๋ด์ ๊ทธ๋ฐ์ง ์ฝ๊ฒ ํด๊ฒฐํ ์ ์์๋ค.
'๐Algorithm > ๐ฅBaekjoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Baekjoon] 14499_์ฃผ์ฌ์ ๊ตด๋ฆฌ๊ธฐ (0) | 2022.05.09 |
---|---|
[Baekjoon] 14503_๋ก๋ด ์ฒญ์๊ธฐ (0) | 2022.05.05 |
[Baekjoon] 1303_์ ์ - ์ ํฌ (0) | 2022.04.26 |
[Baekjoon] 1747_์์&ํฐ๋ฆฐ๋๋กฌ (0) | 2022.04.25 |
[Baekjoon] 1743_์์๋ฌผ ํผํ๊ธฐ (0) | 2022.04.21 |