티스토리 뷰

알고리즘/BOJ

[BOJ-4963] 섬의개수

개발하는 후딘 2020. 3. 11. 05:52
728x90
반응형

https://www.acmicpc.net/problem/4963

 

4963번: 섬의 개수

문제 정사각형으로 이루어져 있는 섬과 바다 지도가 주어진다. 섬의 개수를 세는 프로그램을 작성하시오. 한 정사각형과 가로, 세로 또는 대각선으로 연결되어 있는 사각형은 걸어갈 수 있는 사각형이다.  두 정사각형이 같은 섬에 있으려면, 한 정사각형에서 다른 정사각형으로 걸어서 갈 수 있는 경로가 있어야 한다. 지도는 바다로 둘러쌓여 있으며, 지도 밖으로 나갈 수 없다. 입력 입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스의 첫째 줄에는

www.acmicpc.net


[풀이 ]

전형적인 BFS 문제이다.

섬의 개수를 카운트할 때 MAP[h-1][w-1] 을 시작으로 했다.

 


[코드]

import sys
from collections import deque
input=sys.stdin.readline
q=deque()
MAP=None
visited=None
w,h=0,0

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

def isRange(y,x):
    global w, h
    if (y>=0 and y<h) and (x>=0 and x<w):
        return True
    return False
    

def bfs(y,x):
    global visited, MAP
    q.append((y,x)) #큐에 넣는다.
    while q:
        y,x=q.popleft()
        #아직 방문 안했는가?
        if not visited[y][x]:
            visited[y][x]=True
            for i in range(8):
                nexty=y+dy[i]
                nextx=x+dx[i]
                if isRange(nexty, nextx):
                    #아직방문하지 않은 상태이고, 1인가?
                    if (not visited[nexty][nextx]) and (MAP[nexty][nextx]==1):
                        q.append((nexty,nextx))

def solution():
    global visited, MAP, w, h
    result=0
    for y in range(h-1, -1, -1):
        for x in range(w-1, -1, -1):
            if (MAP[y][x]==1) and (not visited[y][x]):
                bfs(y,x) #탐색
                result+=1
    return result
    
def main():
    global visited, MAP, w,h
    ISLANDS=[]
    while True:
        #w: 지도의 너비/  h: 지도의 높이
        w,h= map(int, input().strip().split())

        #입력 종료
        if (w==0) or (h==0):
            break

        MAP=[] #지도 입력
        visited=[ [False]*w for _ in range(h)] #방문리스트 초기화
        for y in range(h):
            MAP.append([*map(int, input().strip().split())])
        ISLANDS.append(solution())

    #출력
    for i in ISLANDS:
        print(i)

if __name__=='__main__':
    main()
    

728x90
반응형

'알고리즘 > BOJ' 카테고리의 다른 글

[BOJ-1149] RGB거리  (0) 2020.03.15
[BOJ-14503] 로봇청소기2  (0) 2020.03.11
[BOJ-2661] 좋은 수열  (0) 2020.03.11
[BOJ-2011] 암호코드  (0) 2020.03.10
[BOJ-1759] 암호 만들기  (0) 2020.03.06
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함