소스 코드

def bfs(qq,rr):
    global res

    temp = [[qq,rr]]

    while len(temp) != 0:

        i,j = temp.pop(0)

        # 8 방향 확인하기
        for e in range(8):
            ni = i+x[e]
            nj = j+y[e]

            # 지도 밖으로 나가지 않으면
            if 0 <= ni < h and 0 <= nj < w:
                
                # 육지이고 방문한 적 없으면
                if board[ni][nj] == 1 and visited[ni][nj] == 0:
                    temp.append([ni,nj])
                    visited[ni][nj] = 1

    res += 1

    return


# 좌상 상 우상 좌 우 좌하 하 우하
x = [-1,-1,-1,0,0,1,1,1]
y = [-1,0,1,-1,1,-1,0,1]

while True:
    # w,h
    w,h = map(int,input().split())

    # w,h가 모두 0 이면 check의 숫자를 더해서 끝낸다
    if w == 0 and h == 0:
        break

    else:

        # 지도
        board = [list(map(int,input().split())) for _ in range(h)]

        # 섬의 개수
        res = 0

        # 방문 여부
        visited = [[0]*w for _ in range(h)]

        # 섬 보내기
        for q in range(h):
            for r in range(w):
                if board[q][r] == 1 and visited[q][r] == 0:
                    visited[q][r] = 1
                    bfs(q,r)

        print(res)

 


해결 방법

1. bfs를 사용

 

2. 한 번에 방문할 수 있는 육지를 확인한다

 

3. 입력은 여러 개의 테스트 케이스로 이루어져 있음(몇 개인지는 알 수 없음)

 

4. 그래서 while True를 통해 계속 반복하고, w,h가 모두 0 이면 탈출

 


느낀 점

1. 해당 코드를 pycharm에서 돌리면 eof오류가 발생함(답은 나옴)

 

2. 예외처리를 통해 문제를 해결해야 하지만 귀찮아서 그냥 넘어감...(서버에서는 문제 없이 잘 돌아감)

 

ps. 개인적인 코드와 코드를 작성의 이유를 적은 것입니다.

 

오류적절치 않은 문법이 존재할 수 있으며, 다른 분들께는 굉장히 비효율적인 방법으로 여겨질 수 있습니다.

 

혹시 개선 사항, 오류 및 문제에 대한 수정 사항 등을 댓글로 남겨주신다면 감사한 마음으로 배우고 수정하겠습니다.