728x90
섬의 개수 성공다국어
한국어
시간 제한메모리 제한제출정답맞힌 사람정답 비율
1 초 | 128 MB | 68110 | 34562 | 24780 | 49.495% |
문제
정사각형으로 이루어져 있는 섬과 바다 지도가 주어진다. 섬의 개수를 세는 프로그램을 작성하시오.
한 정사각형과 가로, 세로 또는 대각선으로 연결되어 있는 사각형은 걸어갈 수 있는 사각형이다.
두 정사각형이 같은 섬에 있으려면, 한 정사각형에서 다른 정사각형으로 걸어서 갈 수 있는 경로가 있어야 한다. 지도는 바다로 둘러싸여 있으며, 지도 밖으로 나갈 수 없다.
입력
입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스의 첫째 줄에는 지도의 너비 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
DFS로 풀었는데 BFS로도 풀 수 있다.
다른 DFS와 동일하지만 대각선을 탐색하는 케이스도 추가해야한다.
또한, 넓이 높이를 햇갈리지 말자.
#4963 섬의 갯수(그래프이론, 그래프탐색, 너비우선탐색, 깊이우선탐색)
#1은 땅, 0은 바다
#첫째줄에 지도의 크기 가로세로 w h
#두번째줄부터 지도 입력
#지도의 크기가 0 0 이면 입력 종료
import sys
sys.setrecursionlimit(10**9)
li = []
def dfs(x,y):
if x <= -1 or x >= h or y <= -1 or y >= w:
return False
if li[x][y] == 1:
li[x][y] = 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
while True:
w, h = map(int,sys.stdin.readline().split())
if w == 0 and h == 0:
break
for i in range(h):
li.append(list(map(int,sys.stdin.readline().split())))
result = 0
for i in range(h):
for j in range(w):
if dfs(i,j) == True:
result += 1
print(result)
li.clear()
728x90
'Study > CodingTest' 카테고리의 다른 글
[이코테/Python] 5장 - 탐색 (0) | 2024.03.04 |
---|---|
[이코테/Python] 3장 BFS/DFS - 미로 탈출 (0) | 2024.03.01 |
[백준/Python] (S1) 2468 - 안전영역 (3) | 2024.02.28 |
[이코테/Python] 3장 BFS/DFS - 음료수 얼려먹기 (0) | 2024.02.28 |
[백준/Python] (S2)1541 - 잃어버린 괄호 (0) | 2024.02.27 |