백준 4963번 바로가기
나의 풀이#
import sys
sys.setrecursionlimit(10**6)
def check(x,y):
if not 0<=x<h or not 0<=y<w:
return False
if maps[x][y] == 1:
maps[x][y] = 0
check(x-1,y+1)
check(x,y+1)
check(x+1,y+1)
check(x-1,y)
check(x+1,y)
check(x-1,y-1)
check(x,y-1)
check(x+1,y-1)
return True
return False
import sys
for i in sys.stdin:
if i == "0 0\n":
break
w,h = map(int,i.split())
maps = [[] for _ in range(h)]
for i in range(h):
for k in input().split():
maps[i].append(int(k))
count = 0
for i in range(w):
for j in range(h):
if check(j,i):
count += 1
print(count)
다른 풀이 구경하기#
import sys
input=sys.stdin.readline
sys.setrecursionlimit(10000)
dx=[1,0,-1,0,1,1,-1,-1]
dy=[0,1,0,-1,1,-1,-1,1]
def dfs(x,y):
graph[x][y]=0
for i in range(8):
nx=x+dx[i]
ny=y+dy[i]
if 0<=nx<h and 0<=ny<w and graph[nx][ny]==1:
dfs(nx,ny)
while True:
w,h=map(int,input().split())
if w==0 and h==0:
break
graph=[]
count=0
for i in range(h):
graph.append(list(map(int,input().split())))
for i in range(h):
for j in range(w):
if graph[i][j]==1:
dfs(i,j)
count+=1
print(count)
출처
CODE REVIEW#
- 백준 1012번 - 유기농 배추 문제와 매우 유사한 4963번: 섬의 개수. 1012번의 풀이를 응용해서 문제를 풀어냈다.
check()
함수가 대각선 방향도 확인하도록 설정하고, input을 받는 형식만 조금 손봐주면 쉽게 해결 가능하다.
- 주의할 점은 list로 지도를 구현했기에, index번호가 x,y축이 반전된다는 점에 유의해야 한다.
- 다른 풀이 구경하기를 살펴보면, 입력을 받는 형식은 동일하지만 확인된 island을 지워나가는 방식에서 차이가 있다.