[알고리즘] 섬나라 아일랜드(BFS 활용)
(문제) 섬나라 아일랜드(BFS 활용)
섬나라 아일랜드의 지도가 격자판의 정보로 주어집니다.
각 섬은 1로 표시되어 상하좌우와 대각선으로 연결되어 있으며, 0은 바다입니다.
섬나라 아일랜드에 몇 개의 섬이 있는지 구하는 프로그램을 작성하세요.
만약 위와 같다면
입력설명
첫 번째 줄에 자연수 N(3<=N<=20)이 주어집니다.
두 번째 줄부터 격자판 정보가 주어진다.
출력설명
첫 번째 줄에 섬의 개수를 출력한다.
테스트케이스
입력예제 | 출력예제 |
---|---|
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 |
5 |
5 0 0 0 0 0 1 0 0 1 1 0 1 0 1 0 1 1 0 1 0 1 1 0 0 0 |
2 |
10 0 0 0 0 1 0 0 1 1 1 0 1 0 0 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 1 0 1 1 0 0 0 1 0 0 1 1 0 1 1 1 0 0 0 1 1 0 0 0 0 1 0 0 1 1 1 0 0 1 1 1 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 1 1 0 1 0 1 0 0 0 1 1 1 0 0 1 |
5 |
15 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 1 1 1 0 0 1 0 0 0 1 0 1 0 1 1 0 0 0 1 0 0 1 1 0 0 1 0 0 0 |
16 |
해결방법
- 상하좌우 대각선 까지 살피는 리스트를 생성
- 전체 좌표를 1번 씩 돌면서 해당 부분이 1인지 확인
- 1일 경우 bfs를 이용하여 1인 곳을 찾아서 0으로 만든다 만약 bfs를 통한 큐안에 값이 없을 경우 count를 1 더한다
- 반복하여 좌표의 끝까지 확인 후, 끝낸다.
동작 시각화
코드
from collections import deque
# 상, 우, 하, 좌 (대각선 포함)
dx = [-1, 0, 1, -1, 1, -1, 0, 1]
dy = [-1, -1, -1, 0, 0, 1, 1, 1]
# n x n
n = int(input())
# 값 입력
land = [list(map(int,input().split())) for _ in range(n)]
ch_land = [[0] * n for _ in range(n)]
dQ = deque()
count = 0
for x in range(n):
for y in range(n):
# 만약 섬일 경우 값 넣기
if land[x][y] == 1:
dQ.append((x, y))
land[x][y] = 0
while dQ:
size = len(dQ)
now = dQ.popleft()
for i in range(size):
for j in range(8):
# 좌표 안에 있을 경우
# 8 방향 확인
if 0 <= now[0] + dx[j] < n and 0 <= now[1] + dy[j] < n:
# 섬일 경우
if land[now[0] + dx[j]][now[1] + dy[j]] == 1:
land[now[0] + dx[j]][now[1] + dy[j]] = 0
dQ.append((now[0] + dx[j], now[1] + dy[j]))
count = count + 1
print(count)
댓글남기기