문제풀이/백준(Boj) 문제풀이

[백준][DFS/BFS] 21736. 헌내기는 친구가 필요해 (파이썬/Python)

얄루몬 2021. 12. 28. 19:13

<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 문제 유형 !