백준 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

  1. 백준 1012번 - 유기농 배추 문제와 매우 유사한 4963번: 섬의 개수. 1012번의 풀이를 응용해서 문제를 풀어냈다.
  2. check()함수가 대각선 방향도 확인하도록 설정하고, input을 받는 형식만 조금 손봐주면 쉽게 해결 가능하다.
  3. 주의할 점은 list로 지도를 구현했기에, index번호가 x,y축이 반전된다는 점에 유의해야 한다.
  4. 다른 풀이 구경하기를 살펴보면, 입력을 받는 형식은 동일하지만 확인된 island을 지워나가는 방식에서 차이가 있다.