[백준]2667 - 단지번호붙이기
고려사항
if not visited[ny][nx] and a[ny][nx]=="1" and 0<=ny<n and 0<=nx<n:
IndexError 발생. 이 부분에서 ny, nx 범위 조건을 먼저 체크했어야 함. 크게 신경쓰지 않던 부분인데 같은 줄이더라도 작성 순서에 따라 다른 코드가 되는구나… 싶었음
IndexError 발생 코드
from collections import deque
def bfs(visited,i,j,n,a):
qu=deque()
qu.append([i,j])
size=1
visited[i][j]=True
while qu:
y,x=qu.popleft()
for dy,dx in [[0,1],[1,0],[-1,0],[0,-1]]:
ny,nx=y+dy,x+dx
# ny,nx 범위조건 검사 순서 때문에 IndexError발생
if not visited[ny][nx] and a[ny][nx]=="1" and 0<=ny<n and 0<=nx<n:
visited[ny][nx]=True
qu.append([ny,nx])
size+=1
return size
def numbering(n,a):
visited=[[False]*n for _ in range(n)]
res=[]
for i in range(n):
for j in range(n):
if not visited[i][j] and a[i][j]=="1":
res.append(bfs(visited,i,j,n,a))
return res
a=[]
n=int(input())
for _ in range(n):
a.append(list(input()))
res=numbering(n,a)
res.sort()
print(len(res))
for i in res:
print(i)
최종 코드
#S1_2667_단지번호붙이기
from collections import deque
def bfs(visited,i,j,n,a):
qu=deque()
qu.append([i,j])
size=1
visited[i][j]=True
while qu:
y,x=qu.popleft()
for dy,dx in [[0,1],[1,0],[-1,0],[0,-1]]:
ny,nx=y+dy,x+dx
if 0<=ny<n and 0<=nx<n and not visited[ny][nx] and a[ny][nx]=="1":
visited[ny][nx]=True
qu.append([ny,nx])
size+=1
return size
def numbering(n,a):
visited=[[False]*n for _ in range(n)]
res=[]
for i in range(n):
for j in range(n):
if not visited[i][j] and a[i][j]=="1":
res.append(bfs(visited,i,j,n,a))
return res
a=[]
n=int(input())
for _ in range(n):
a.append(list(input()))
res=numbering(n,a)
res.sort()
print(len(res))
for i in res:
print(i)
Leave a comment