본문 바로가기

알고리즘 삽질장

[인프런] 섬나라 아일랜드

반응형


문제설명

섬나라 아일랜드의 지도가 격자판의 정보로 주어진다. 각 섬은 1로 표시되어 상하좌우와 대각선으로 연결되어 있으며, 0은 바다이다. 섬나라 아일랜드에 몇 개의 섬이 있는지 구하라.

 

입력조건

  • 첫 줄에 자연수 N(3 <= N <= 20)이 주어진다.
  • 둘째 줄부터 격자판 정보가 주어진다.

출력조건

  • 첫 줄에 섬의 개수를 출력한다.

사고과정

  • 단지 번호 붙이기 문제랑 비슷한 유형이다. 이것도 DFS/BFS 둘 다 활용해서 풀 수 있는 문제이다. 

풀이

- 한 소스코드 안에 dfs, bfs로 풀어보는 풀이 둘 다 작성했다.

from collections import deque

n = int(input())
board = [list(map(int, input().split())) for _ in range(n)]

dx = [-1, 1, 0, 0, -1, -1, 1, 1]
dy = [0, 0, -1, 1, -1, 1, -1, 1]

def bfs(x, y):
    board[x][y] = 0
    queue = deque([(x, y)])
    while queue:
        x, y = queue.popleft()
        for i in range(len(dx)):
            nx, ny = x + dx[i], y + dy[i]
            if 0 <= nx < n and 0 <= ny < n and board[nx][ny] == 1:
                board[nx][ny] = 0
                queue.append((nx, ny))
    return

def dfs(x, y):
    board[x][y] = 0
    for i in range(len(dx)):
        nx, ny = x + dx[i], y + dy[i]
        if 0 <= nx < n and 0 <= ny < n and board[nx][ny] == 1:
            dfs(nx, ny)

cnt = 0
for i in range(n):
    for j in range(n):
        if board[i][j] == 1:
            dfs(i, j)
            cnt += 1
print(cnt)
반응형

'알고리즘 삽질장' 카테고리의 다른 글

[인프런] 토마토  (0) 2021.12.01
[인프런] 안전영역  (0) 2021.11.30
[인프런] 단지 번호 붙이기  (0) 2021.11.30
[인프런] 등산경로  (0) 2021.11.29
[인프런] 미로탐색  (0) 2021.11.29