💡문제접근
- 산봉우리의 정의를 다시 한 번 되짚어보자.
- 산봉우리는 같은 높이를 가지는 하나의 격자 혹은 인접한 격자들의 집합으로 이루어져 있다. (여기서 "인접하다"의 정의는 X좌표 차이와 Y좌표 차이 모두 1 이하일 경우로 정의된다.) 또한 산봉우리와 인접한 격자는 모두 산봉우리의 높이보다 작아야한다.
- 위의 산봉우리의 정의를 정리해보면 인접한 방향은 상하좌우 그리고 대각선 방향도 포함된다.
- 뿐만 아니라 높이가 0인 산봉우리는 산봉우리로 취급하지 않고 만약 인접한 좌표의 높이가 현재 좌표의 높이와 같은 경우라면 재귀를 사용해서 인접한 방향으로 계속 나아가면서 산봉우리의 끝을 찾는 방식으로 코드를 작성했다.
- 공부하는 차원에서 DFS, BFS 탐색 알고리즘을 모두 사용해서 문제를 풀어봤다.
💡코드1(메모리 : 31256KB, 시간 : 64ms) - DFS
import sys
input = sys.stdin.readline
sys.setrecursionlimit(10**6)
N, M = map(int, input().strip().split())
farm = [list(map(int, input().strip().split())) for _ in range(N)]
visited = [[False] * M for _ in range(N)]
def DFS(a, b):
global flag
da = [0, 1, 1, 1, 0, -1, -1, -1]
db = [-1, -1, 0, 1, 1, 1, 0, -1]
for i in range(8):
na = a + da[i]
nb = b + db[i]
if na < 0 or na >= N or nb < 0 or nb >= M:
continue
if farm[na][nb] > farm[a][b]:
flag = False
if 0 <= na < N and 0 <= nb < M and not visited[na][nb] and farm[na][nb] == farm[a][b]:
visited[na][nb] = True
DFS(na, nb)
cnt = 0
for i in range(N):
for j in range(M):
if farm[i][j] > 0 and not visited[i][j]:
flag = True
DFS(i, j)
if flag:
cnt += 1
print(cnt)
💡코드2(메모리 : 34192KB, 시간 : 84ms) -BFS
from collections import deque
import sys
input = sys.stdin.readline
N, M = map(int, input().strip().split())
farm = [list(map(int, input().strip().split())) for _ in range(N)]
visited = [[False] * M for _ in range(N)]
def BFS(a, b):
global flag
queue = deque()
queue.append((a, b))
visited[a][b] = True
while queue:
x, y = queue.popleft()
dx = [0, 1, 1, 1, 0, -1, -1, -1]
dy = [-1, -1, 0, 1, 1, 1, 0, -1]
for i in range(8):
nx = x + dx[i]
ny = y + dy[i]
if nx < 0 or nx >= N or ny < 0 or ny >= M:
continue
if farm[nx][ny] > farm[x][y]:
flag = False
if 0 <= nx < N and 0 <= ny < M and not visited[nx][ny] and farm[nx][ny] == farm[x][y]:
visited[nx][ny] = True
queue.append((nx, ny))
cnt = 0
for i in range(N):
for j in range(M):
if farm[i][j] > 0 and not visited[i][j]:
flag = True
BFS(i, j)
if flag:
cnt += 1
print(cnt)
💡소요시간 : 10m