[백준]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