Coding Test/BaekJoon_Python

백준 1245 <농장 관리> Python

JunOnJuly 2025. 1. 19. 16:09
728x90

https://www.acmicpc.net/problem/1245


그래프 순회 문제입니다.

 

그래프를 순회하며 현재 탐색하고 있는 높이보다 높고 인접한 위치가 존재하는지 탐색해주면 됩니다.

다만 주의해야 할 점이 두 가지 있습니다.

 

첫 번째는 임의의 인덱스에서 탐색할 위치가 상 하 좌 우 네 방향이 아닌 좌상 좌하 우상 우하 를 합친 여덟 방향이라는 점 입니다.

두 번째는 탐색시에 방문 목록을 작성하며 중복하지 않게 탐색할텐데 자신보다 낮은 위치나 높은 위치를 탐색할 때에도 방문 체크를 한다면 다음 높이를 탐색할 때 해당 위치를 탐색하지 않아 정확하게 탐색할 수 없다는 점입니다. 자신과 같은 위치만 방문 체크를 하며 탐색해야 합니다.


import sys
from collections import deque

input = sys.stdin.readline


def solution(N, M, heights):
    # 봉우리 카운트
    cnt = 0
    # 방문 목록
    visited = [[0 for _ in range(M)] for __ in range(N)]
    # 탐색 위치
    move_dir = [[0, 1], [0, -1], [1, 0], [-1, 0], [1, 1], [-1, -1], [1, -1], [-1, 1]]
    # 큐
    q = deque()
    # 순회
    while True:
        # 큐가 비어있으면
        if not q:
            # 방문하지 않은 위치 큐에 넣기
            for i in range(N):
                if not q:
                    for j in range(M):
                        if not visited[i][j]:
                            q.append([i, j])
                            # 방문 체크
                            visited[i][j] = 1
                            break
                
                else:
                    break
        
        # 그래도 큐가 비어있으면
        if not q:
            # 끝
            break
            
        # 현재 탐색하는 위치가 봉우리인지
        is_peak = 1
        # 순회
        while q:
            # 현재 위치
            now_x, now_y = q.popleft()
            # 현재 높이
            now_height = heights[now_x][now_y]
            # 다음 위치 탐색
            for x, y in move_dir:
                next_x = now_x + x
                next_y = now_y + y
                # 다음 위치가 인덱스 범위 내면
                if (next_x >= 0 and next_x < N and 
                    next_y >= 0 and next_y < M):
                    # 다음 위치의 높이
                    next_height = heights[next_x][next_y]
                    # 다음 위치의 높이가 현재 위치의 높이와 같으면
                    if next_height == now_height:
                        # 방문하지 않았다면
                        if not visited[next_x][next_y]:
                            # 방문
                            visited[next_x][next_y] = 1
                            # 큐에 삽입
                            q.append([next_x, next_y])

                    # 다음 위치의 높이가 현재 위치의 높이보다 높으면
                    elif next_height > now_height:
                        # 봉우리가 아님
                        is_peak = 0

        # 봉우리 카운트
        cnt += is_peak
    
    print(cnt)


# 입력
N, M = map(int, input().strip().split())
heights = [list(map(int, input().strip().split())) for _ in range(N)]

solution(N, M, heights)
728x90