less than 1 minute read

고려사항

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