본문 바로가기
코딩 테스트 수련의방

백준 #4963

by L3m0n S0ju 2022. 3. 30.

 

섬의 개수 성공다국어

한국어   
시간 제한메모리 제한제출정답맞힌 사람정답 비율
1 초 128 MB 42368 21330 15314 49.292%

문제

정사각형으로 이루어져 있는 섬과 바다 지도가 주어진다. 섬의 개수를 세는 프로그램을 작성하시오.

한 정사각형과 가로, 세로 또는 대각선으로 연결되어 있는 사각형은 걸어갈 수 있는 사각형이다. 

두 정사각형이 같은 섬에 있으려면, 한 정사각형에서 다른 정사각형으로 걸어서 갈 수 있는 경로가 있어야 한다. 지도는 바다로 둘러싸여 있으며, 지도 밖으로 나갈 수 없다.

입력

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스의 첫째 줄에는 지도의 너비 w와 높이 h가 주어진다. w와 h는 50보다 작거나 같은 양의 정수이다.

둘째 줄부터 h개 줄에는 지도가 주어진다. 1은 땅, 0은 바다이다.

입력의 마지막 줄에는 0이 두 개 주어진다.

출력

각 테스트 케이스에 대해서, 섬의 개수를 출력한다.

예제 입력 1 복사

1 1
0
2 2
0 1
1 0
3 2
1 1 1
1 1 1
5 4
1 0 1 0 0
1 0 0 0 0
1 0 1 0 1
1 0 0 1 0
5 4
1 1 1 0 1
1 0 1 0 1
1 0 1 0 1
1 0 1 1 1
5 5
1 0 1 0 1
0 0 0 0 0
1 0 1 0 1
0 0 0 0 0
1 0 1 0 1
0 0

예제 출력 1 복사

0
1
1
3
1
9

출처

ICPC > Regionals > Asia Pacific > Japan > Japan Domestic Contest > 2009 Japan Domestic Contest B번

  • 문제를 번역한 사람: baekjoon
  • 문제의 오타를 찾은 사람: j4bez

 

 

 

 

 

 

 


import sys
from collections import deque
sys.setrecursionlimit(10 ** 7)
input = sys.stdin.readline

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

def dfs(x, y, visited):
    visited[x][y] = True
    if graph[x][y] == 0:
        return

    for i in dx:
        for j in dy:
            if 0 <= (x+i) < h and 0 <= (y+j) < w and visited[x+i][y+j] == False:
                dfs(x+i, y+j, visited)

if __name__ == '__main__':

    while(1):
        w, h = map(int, input().split())
        if w ==0 and h == 0:
            break

        graph = []

        for i in range(h):
            graph.append(list(map(int, input().split())))

        visited = [[False for i in range(w)] for j in range(h)]

        count = 0
        for i in range(h):
            for j in range(w):
                if visited[i][j] == False and graph[i][j] == 1:
                    count += 1
                    dfs(i, j, visited)
        
        print(count)

visited 이차 리스트를 만들 때 [False * w] * h 이런식으로 이차 리스트를 만들었는데 문제는 이후 visited[0][0] = True 와 같이 특정 원소를 변경하면 visited[1][0], visited[2][0]... 와 같이 다른 값들도 True로 변하는 문제가 발생했다. 원인을 찾아보니 얇은 복사를 해서 이런 현상이 발생하는데 해결법을 찾아보니 for문을 이용해서 리스트를 만들면 문제를 해결할 수 있다고 해서 for문을 이용해서 이차 리스트를 생성했다. 

 

dfs 함수는 주변으로 이동할 때 dx, dy를 이용해서 주변 지형으로 이동하면서 모든 지형을 한번씩 방문하고 count를 1 올리고 다음 지형으로 이동해서 또 다시 이동가능한 지형을 방문하고 count를 1 올리는 식으로 진행했다.

'코딩 테스트 수련의방' 카테고리의 다른 글

백준 #11403  (0) 2022.04.10
백준 #2468  (0) 2022.04.01
백준 #11724  (0) 2022.03.30
백준 #1697  (0) 2022.03.28
백준 #1149  (0) 2022.03.28

댓글