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

한 정사각형과 가로, 세로 또는 대각선으로 연결되어 있는 사각형은 걸어갈 수 있는 사각형이다.
두 정사각형이 같은 섬에 있으려면, 한 정사각형에서 다른 정사각형으로 걸어서 갈 수 있는 경로가 있어야 한다. 지도는 바다로 둘러싸여 있으며, 지도 밖으로 나갈 수 없다.
입력
입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스의 첫째 줄에는 지도의 너비 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
코드
import sys
from collections import deque
def dfs(x,y):
if(x<0 or y<0 or x>=w or y>=h):
return False
if(graph[y][x]==1):
graph[y][x]=0
dfs(x+1,y)
dfs(x-1,y)
dfs(x,y+1)
dfs(x,y-1)
dfs(x+1,y+1)
dfs(x+1,y-1)
dfs(x-1,y-1)
dfs(x-1,y+1)
return True
return False
if __name__=="__main__":
while(True):
cnt=0
w,h=map(int,input().split())
graph=[]
if(w==0 and h==0):
break
for i in range(h):
graph.append(list(map(int,input().split())))
for i in range(h):
for k in range(w):
if(dfs(k,i)==True):
cnt+=1
print(cnt)
코드설명
1. [0,0] 이 나오기 전까지는 계속 입력을 받아야하므로 가장 바깥에 무한반복문을 사용하여준다.
2. 높이(h)와 너비(w)를 입력받은후, 섬(graph)을 입력받아준다.
3. 입력받은후 시작점을 모르기때문에 모든점을 돌면서 1이 나오면 좌표를 넣어 dfs함수에 넣어준다.(높이와 너비의 최대값이 25로 크지않으므로 이중for문으로 넣어줘도 괜찮다.)
4-1. dfs함수에 들어가서 양옆 위아래 대각선까지 모두 이동할수 있다 하였으므로, 최초의 좌표에서 모든 방향으로의 좌표를 넣어 재귀함수를 돌려준다.
4-2. 재귀함수로 이동한 값에서도 값이1이라면 위와 똑같이 재귀함수를 돌려주지만, 만약 좌표가 음수이거나, 최대값보다 크다면 반환해준다. 만약 어느 조건에도 맞지않아도 리턴해준다.
5. dfs함수에 들어갔다면 섬이 한개 발견됬다는 것임으로 cnt에 1을 더해준다.
6. 구해진 cnt를 출력해준다!
느낀점 및 배운점
백준2667번 : 단지번호붙이기(python)
문제 <그림 1>과 같이 정사각형 모양의 지도가 있다. 1은 집이 있는 곳을, 0은 집이 없는 곳을 나타낸다. 철수는 이 지도를 가지고 연결된 집의 모임인 단지를 정의하고, 단지에 번호를 붙이려 한
studyticket.tistory.com
이전의 문제를 풀면서 그래프를 돌때 x,y좌표 또는 내가 임의로 위치를 정해줌으로써 이동하면서 dfs를 활용할수 있다는것을 배워, 이전의 문제를 풀때보다 수월하게 풀었다. (사실 똑같이 풀면되는것이었다...)
'Algorithm > 백준' 카테고리의 다른 글
백준 2309번 : 일곱 난쟁이(python) (0) | 2021.12.23 |
---|---|
백준 2178번 : 미로 탐색(python) (0) | 2021.12.21 |
백준2667번 : 단지번호붙이기(python) (0) | 2021.12.16 |
백준 11724번 : 연결 요소의 개수(python) (0) | 2021.12.10 |
백준 13023번 : ABCDE (python) (0) | 2021.12.09 |