- 문제 : https://www.acmicpc.net/problem/16946
Gold Level2 문제
쉽다고 생각한 문제였다. 1인 지점을 기준으로 주변의 0의 갯수를 세는 bfs를 실행한 다음 그 갯수를 그 위치값에 넣는 식으로 진행했다
그랬더니 계속 시간초과 문제가 나서 이전 풀이를 다시 보았다
위 방법으로 진행하면 시간초과가 나므로 관점을 바꿔서 0을 정점으로 보고 연결요소들의 크기를 계산하는 것이다.
각 연결요소를 구할 때 인접한 벽들을 기억하고 있다가 연결요소를 모두 구했을 때 그 크기를 기억해둔 벽들의 좌표에 더해주는 방식으로 진행해 주면 된다
다른 부분은 다 이해가는데, 유독 itr인 부분이 이해가지 않는다
해당 bfs에 있지만, 아직 방문하지 않은 노드에 대해서 0이면 탐색 진행하고, 1이면 temp에 삽입한다
bfs를 실행한 뒤 iter += 1을 하는 것으로 보아 0의 갯수를 세는 것 같다
하나의 0이 영향을 미칠 수 있는 1의 갯수는 여러개이므로 visit 값이 0,1이 아닌 itr로 이루어진건가??
그래야지 각 bfs를 거치면서 0을 중복으로 셀 수 있으니까
- 정답 풀이 :
from collections import deque
n,m = map(int,input().split())
data = [list(map(int, input())) for _ in range(n)]
visit = [[0]*m for _ in range(n)]
answer = [[0]*m for _ in range(n)]
dx = [-1,1,0,0]
dy = [0,0,-1,1]
def bfs(x,y,itr):
visit[x][y] = itr
queue=deque()
queue.append((x,y))
count = 1
temp = []
while queue:
x,y = queue.popleft()
for i in range(4):
nx,ny = x + dx[i], y + dy[i]
if 0 <= nx < n and 0 <= ny < m and visit[nx][ny] != itr:
#0인 경우
if not data[nx][ny] :
visit[nx][ny] = itr
#0의 갯수 세기
count += 1
queue.append((nx,ny))
#1인 경우
else:
temp.append([nx,ny])
visit[nx][ny] = itr
for i,j in temp:
answer[i][j] += count
for i in range(n):
for j in range(m):
if data[i][j]:
answer[i][j] = 1
itr = 1
for i in range(n):
for j in range(m):
#방문하지 않았고, 0인 위치에 대해서 bfs 진행
if not data[i][j] and not visit[i][j]:
bfs(i,j,itr)
itr += 1
for i in range(n):
for j in range(m):
print(answer[i][j] % 10, end='')
print()
- 시도해본 풀이
import sys
from collections import deque
input = sys.stdin.readline
n,m = map(int,input().split())
data = [list(input()) for _ in range(n)]
answer = [[0]*m for _ in range(n)]
dx = [-1,1,0,0]
dy = [0,0,-1,1]
def bfs(x,y,data):
visit = [[0]*m for _ in range(n)]
visit[x][y] = 1
queue=deque()
queue.append((x,y))
count = 1
while queue:
x,y = queue.popleft()
for i in range(4):
nx,ny = x + dx[i], y + dy[i]
if 0 <= nx < n and 0 <= ny < m:
if data[nx][ny] == '0' and not visit[nx][ny]:
visit[nx][ny] = 1
count += 1
queue.append((nx,ny))
return str(count)
answer = 0
for i in range(n):
for j in range(m):
if data[i][j] == '1':
answer = bfs(i,j,data)
data[i][j] = answer
for i in range(n):
temp=''
for j in range(m):
temp += data[i][j]
print(temp)
'백준 > Search' 카테고리의 다른 글
[bfs/백준] 1303번 : 전쟁 - 전투 (0) | 2022.08.10 |
---|---|
[bfs/백준] 18352번 : 특정 거리의 도시 찾기 (0) | 2022.08.09 |
[dfs/백준] 1405번 : 미친 로봇 (0) | 2022.08.09 |
[bfs/백준] 17471번 : 게리맨더링 (0) | 2022.08.08 |
[dfs/백준] 2250번 : 트리의 높이와 너비 (0) | 2022.08.08 |