[백준] 1245 - 농장 관리 (BFS,DFS, trigger)

김영민·2024년 7월 12일
0

코딩테스트

목록 보기
8/32


코드

BFS


N,M = map(int,input().split(" "))

graph = [list(map(int, input().split(" "))) for _ in range(N)]

visited = [list(False for _ in range(M)) for _ in range(N)]

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

from collections import deque

def BFS(x,y):
    global trigger

    Q = deque()

    Q.append([x,y])

    while Q:
        x,y = Q.popleft()

        visited[x][y]=True

        for i in range(8):
            nx,ny = x+dx[i],y+dy[i]

            if 0<=nx<N and 0<=ny<M:
                if graph[x][y] == graph[nx][ny] and visited[nx][ny]==False:
                    Q.append([nx,ny])
                
                if graph[x][y] < graph[nx][ny]:
                    trigger = False



result = 0
for i in range(N):
    for j in range(M):
        if graph[i][j] > 0 and visited[i][j]==False:
            trigger = True
            BFS(i,j)

            if trigger == True:
                result += 1

print(result)

DFS

# 8 7
# 4 3 2 2 1 0 1
# 3 3 3 2 1 0 1
# 2 2 2 2 1 0 0
# 2 1 1 1 1 0 0
# 1 1 0 0 0 1 0
# 0 0 0 1 1 1 0
# 0 1 2 2 1 1 0
# 0 1 1 1 2 1 0

N,M = map(int,input().split(" "))

graph = [list(map(int, input().split(" "))) for _ in range(N)]

visited = [list(False for _ in range(M)) for _ in range(N)]

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

from collections import deque

def DFS(x,y):
    global trigger

    visited[x][y] = True

    for i in range(8):
        nx,ny = x+dx[i], y+dy[i]

        if 0<=nx<N and 0<=ny<M:
            if graph[x][y] < graph[nx][ny]:
                trigger = False
            
            elif graph[x][y] == graph[nx][ny] and visited[nx][ny] == False:

                DFS(nx,ny)



result = 0
for i in range(N):
    for j in range(M):
        if graph[i][j] > 0 and visited[i][j]==False:
            trigger = True
            DFS(i,j)

            if trigger == True:
                result += 1

print(result)

풀이

  • 핵심은 trigger라고 생각한다.
  • 우리가 확인하는 지점에 대해 8 방향 중에 한 방향의 지점이라도 확인 지점보다 높은 곳이 있다면, trigger를 False로 만들어 산봉우리가 아님을 코드 내에 저장해야 한다.
  • 또한, 산봉우리가 0일 수는 없으므로 이중 for문을 돌 때 그래프 내의 값이 0보다 큰 것을 확인해야 한다.
  • 트리거 문제는 DFS,BFS 모두 쉽게 풀 수 있다는 생각이 들었다.

0개의 댓글