개발 연습장/백준 문제풀이

[파이썬, Python] 백준 21736: 헌내기는 친구가 필요해

LooanCheong 2023. 10. 31. 12:07
반응형

문제

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

 

21736번: 헌내기는 친구가 필요해

2020년에 입학한 헌내기 도연이가 있다. 도연이는 비대면 수업 때문에 학교에 가지 못해 학교에 아는 친구가 없었다. 드디어 대면 수업을 하게 된 도연이는 어서 캠퍼스 내의 사람들과 친해지고

www.acmicpc.net

코드

import sys
sys.setrecursionlimit(10**6)
input = sys.stdin.readline

n, m = map(int, input().split())

land = [list(input()) for _ in range(n)]
visited = [[False for _ in range(m)] for _ in range(n)]

dx, dy = [1, 0, -1, 0], [0, 1, 0, -1]

def dfs(x, y):
    global cnt
    if land[x][y] == "P":
        cnt += 1
    visited[x][y] = True

    for i in range(4):
        nx = x + dx[i]
        ny = y + dy[i]

        if 0 <= nx < n and 0 <= ny < m and land[nx][ny] != "X" and visited[nx][ny] == False:
            dfs(nx, ny)

cnt = 0

for i in range(n):
    for j in range(m):
        if land[i][j] == "I":
            dfs(i, j)

if cnt == 0:
    print("TT")
else:
    print(cnt)

설명

dfs를 통해서 해결했다.

우선 입력값을 받아주고 방문을 확인할 visited를 만들어준다.

그리고 dfs를 정의해 준다.
우선 방문한 좌표에 대해서 방문으로 처리해 주고 4방향을 확인해 준다.
범위가 넘어가지 않는지, 그리고 벽이 아닌지, 방문을 하지 않았는지를 순서대로 확인한다.
사람에 대한 조건이 따로 없어서 고민했는데 벽만 통과하지 못한다고 했으므로 사람일 경우에도 통과가 가능하다.
dfs의 시작 부분에 해당 좌표에 있는 것이 사람이라면 카운트를 해주는 조건문도 하나 만들어준다.

시작 좌표가 따로 주어지지 않으므로 반복문을 통해서 시작 좌표를 찾아주고 dfs를 실행해 준다.

결과가 0이라면 TT를 그렇지 않다면 cnt의 값을 출력해 주자.

반응형