<DFS로 구현>
import sys
sys.setrecursionlimit(100001)
def DFS(x,y):
global cnt
if 0 <= x < n and 0 <= y < m and not visited[x][y] and campus[x][y] != 'X':
visited[x][y]=True
if campus[x][y]=='P':
cnt+=1
for i in range(4):
nx=x+dx[i]
ny=y+dy[i]
DFS(nx,ny)
n,m = map(int,input().split())
visited = [[False]*m for _ in range(n)]
campus = []
dx = [0,0,-1,1]
dy = [1,-1,0,0]
x = y = 0 #도연이 위치를 저장할 정보
cnt = 0
for _ in range(n):
campus.append(list(input().strip()))
for i in range(n):
for j in range(m):
if campus[i][j] == "I":
x = i
y = j
DFS(x,y)
if cnt == 0:
print("TT")
else:
print(cnt)
# 재귀함수 호출 횟수 제한을 걸지 않으면 런타임 에러가 난다 주의하자.
<BFS로 구현>
import sys
from collections import deque
input = sys.stdin.readline
def BFS(x,y):
global cnt
q = deque()
q.append((x,y))
while q:
x,y = q.popleft()
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if 0 <= nx < n and 0 <= ny < m and not visited[nx][ny] and campus[nx][ny] != "X":
visited[nx][ny] = True
q.append((nx,ny))
if campus[nx][ny] == 'P':
cnt+=1
return cnt
n,m = map(int,input().split())
visited = [[False]*m for _ in range(n)]
campus = []
dx = [0,0,-1,1]
dy = [1,-1,0,0]
x = y = 0 #도연이 위치를 저장할 정보
cnt = 0
for _ in range(n):
campus.append(list(input().strip()))
for i in range(n):
for j in range(m):
if campus[i][j] == "I":
x = i
y = j
BFS(x,y)
if cnt == 0:
print("TT")
else:
print(cnt)
조건이 많아 조오금 헷갈릴 순 있지만 어렵지 않은 기본 DFS / BFS 문제 유형 !
'문제풀이 > 백준(Boj) 문제풀이' 카테고리의 다른 글
[백준][DFS/BFS] 2583. 영역 구하기 (파이썬/Python) (0) | 2021.12.30 |
---|---|
[백준][Dijkstra/다익스트라] 4885. 녹색 옷 입은 애가 젤다지? (파이썬/Python) (0) | 2021.12.29 |
[백준][Floyd-Warshall/BFS]2660.회장 뽑기 (파이썬/Python) (0) | 2021.12.27 |
[백준][그리디 알고리즘] 20044. Project Teams(파이썬/Python) (0) | 2021.12.27 |
[백준][Greedy/BFS] 16953. A → B (파이썬/Python) (0) | 2021.12.27 |