[백준 파이썬] 1245 농장 관리

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

 

1245번: 농장 관리

첫째 줄에 정수 N(1 < N ≤ 100), M(1 < M ≤ 70)이 주어진다. 둘째 줄부터 N+1번째 줄까지 각 줄마다 격자의 높이를 의미하는 M개의 정수가 입력된다. 격자의 높이는 500보다 작거나 같은 음이 아닌 정수

www.acmicpc.net

 

 

문제

etc-image-0

농장의 높이가 주어지고 산봉우리의 개수를 구하는 문제이다.

 


 

풀이

농장에 높이가 주어지므로 산봉오리를 구하는 식을세우면 된다.

산봉오리는 인접 8개의 방향보다 높은 곳이므로 dfs를 이용하여 해결하였다.

 

def dfs(r, c):
  nowHeight = farm[r][c]
  stack = [(r, c)]
  flag = True

  while stack:
    r, c = stack.pop()
    for dr, dc in drc:
      nr = r + dr
      nc = c + dc
      if 0 <= nr < N and 0 <= nc < M:
        if not visited[nr][nc] and farm[nr][nc] == nowHeight: #방문하지 않았고, 이동한 위치가 현재 높이와 같은경우
          stack.append((nr, nc))
          visited[nr][nc] = True
        
        elif farm[nr][nc] > nowHeight: #이동한 위치가 현재 위치보다 높을경우
          flag = False
    
  if flag:
    return True
  
  return False

 

코드를 보면 방향을 이동해준 후 방문여부를 체크하고,  두가지의 경우를 세운다

1. 이동한 위치가 이전 위치와 높이가 같은경우

    해당 경우에는 묶어서 산봉우리가 될 가능성이 있으므로 스택에 넣어준다.

 

2. 이동한 위치가 현재 위치보다 높은경우

    해당 경우는 이동한 위치가 산봉우리이므로 false를 반환한다.

 

for r in range(N):
    for c in range(M):
        if not visited[r][c] and dfs(r, c):
            cnt += 1

이렇게 모든 위치에 대해 탐색을 진행하여 false경우를 카운팅하면 해당 카운트가 산봉우리의 개수가 된다.

 

 


코드


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

farm = [list(map(int, input().split())) for _ in range(N)]
visited = [[False] * M for _ in range(N)]
drc = [(0, -1), (-1, -1), (-1, 0), (-1, 1), (0, 1), (1, 1), (1, 0), (1, -1)]
cnt = 0
stack = []


def dfs(r, c):
  nowHeight = farm[r][c]
  stack = [(r, c)]
  flag = True

  while stack:
    r, c = stack.pop()
    for dr, dc in drc:
      nr = r + dr
      nc = c + dc
      if 0 <= nr < N and 0 <= nc < M:
        if not visited[nr][nc] and farm[nr][nc] == nowHeight: #방문하지 않았고, 이동한 위치가 현재 높이와 같은경우
          stack.append((nr, nc))
          visited[nr][nc] = True
        
        elif farm[nr][nc] > nowHeight: #이동한 위치가 현재 위치보다 높을경우
          flag = False
    
  if flag:
    return True
  
  return False


for r in range(N):
    for c in range(M):
        if not visited[r][c] and dfs(r, c):
            cnt += 1

print(cnt)