파이썬 알고리즘-66 (DFS/BFS 활용) 섬나라 아일랜드

jiffydev·2020년 10월 4일
0

Algorithm

목록 보기
73/134
post-thumbnail

섬나라 아일랜드(BFS 활용)
섬나라 아일랜드의 지도가 격자판의 정보로 주어집니다. 각 섬은 1로 표시되어 상하좌우와 대각선으로 연결되어 있으며, 0은 바다입니다. 섬나라 아일랜드에 몇 개의 섬이 있는지 구하는프로그램을 작성하세요.
1 1 0 0 0 1 0
0 1 1 0 1 1 0
0 1 0 0 0 0 0
0 0 0 1 0 1 1
1 1 0 1 1 0 0
1 0 0 0 1 0 0
1 0 1 0 1 0 0
만약 위와 같다면

▣ 입력설명
첫 번째 줄에 자연수 N(3<=N<=20)이 주어집니다.
두 번째 줄부터 격자판 정보가 주어진다.

▣ 출력설명
첫 번째 줄에 섬의 개수를 출력한다.

▣ 입력예제 1
7
1 1 0 0 0 1 0
0 1 1 0 1 1 0
0 1 0 0 0 0 0
0 0 0 1 0 1 1
1 1 0 1 1 0 0
1 0 0 0 1 0 0
1 0 1 0 1 0 0

▣ 출력예제 1
5

내 코드

from collections import deque

n=int(input())
lst=[list(map(int, input().split())) for _ in range(n)]
dx=[0,1,1,1,0,-1,-1,-1]
dy=[-1,-1,0,1,1,1,0,-1]
dq=deque()
cnt=0
for i in range(n):
    for j in range(n):
        if lst[i][j]==1:
            dq.append((i,j))
            lst[i][j]=0
            for now in range(len(dq)):
                for k in range(8):
                    x=now[0]+dx[k]
                    y=now[1]+dy[k]
                    if lst[x][y]==1:
                        lst[x][y]=0
                        dq.append((x,y))

격자를 하나씩 돌면서 1인 경우 섬을 발견한 것이라 가정하고, 그 안에서 1인 것들을 bfs로 찾으려고 했는데 for로 하려니까 잘 안됐다.

풀이

from collections import deque

dx=[-1, -1, 0, 1, 1, 1, 0, -1]
dy=[0, 1, 1, 1, 0, -1, -1, -1]
n=int(input())
board=[list(map(int, input().split())) for _ in range(n)]
cnt=0
Q=deque()
for i in range(n):
    for j in range(n):
        if board[i][j]==1:
            board[i][j]=0
            Q.append((i, j))
            while Q:
                tmp=Q.popleft()
                for k in range(8):
                    x=tmp[0]+dx[k]
                    y=tmp[1]+dy[k]
                    if 0<=x<n and 0<=y<n and board[x][y]==1:
                        board[x][y]=0
                        Q.append((x, y))
            cnt+=1
print(cnt)

반성점

  • bfs에서는 while문을 많이 사용하는거 같은데 그 부분을 간과했다.

배운 것

profile
잘 & 열심히 살고싶은 개발자

0개의 댓글