본문 바로가기
문제 해결/BOJ

[백준] 피리 부는 사나이

by 자잘 2023. 3. 10.

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

 

16724번: 피리 부는 사나이

첫 번째 줄에 지도의 행의 수를 나타내는 N(1 ≤ N ≤ 1,000)과 지도의 열의 수를 나타내는 M(1 ≤ M ≤ 1,000)이 주어진다. 두 번째 줄부터 N개의 줄에 지도의 정보를 나타내는 길이가 M인 문자열이 주

www.acmicpc.net

이 문제의 핵심은 DFS를 통해 싸이클을 찾는 것 그리고 다른 싸이클에 포함이 되는지 여부를 찾는 것입니다. 방문되지 않은 위치를 시작으로 DFS로 탐색하다가 방문한 위치를 다시 방문하게 되었을 때 값이 -1이면 새로운 싸이클을 만난 것이고 0보다 큰 값이면 기존에 탐색된 다른 싸이클에 포함되는 것을 의미합니다. 각각의 싸이클에 SAFE ZONE을 설치하면 되므로 싸이클의 수가 곧 정답이 되게 됩니다.

 

import sys

#sys.stdin = open("input.txt", "r")
input = sys.stdin.readline

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

board = [
    list(map(str, input().rstrip()))
    for _ in range(n)
]

visited = [
    [0] * m
    for _ in range(n)
]

ans = 0

map = {
    'U': 0,
    'R': 1,
    'D': 2,
    'L': 3
}

group = 0

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

def dfs(y, x):
    global group

    visited[y][x] = -1

    dir = map[board[y][x]]

    ny = y + dy[dir]
    nx = x + dx[dir]

    # 새로운 싸이클인 경우
    if visited[ny][nx] == -1:
        group += 1
        visited[y][x] = group
        return group

    # 다른 싸이클을 만나는 경우
    if visited[ny][nx] > 0:
        visited[y][x] = visited[ny][nx]
        return visited[y][x]

    visited[y][x] = dfs(ny, nx)
    return visited[y][x]

for i in range(n):
    for j in range(m):
        if not visited[i][j]:
            dfs(i, j)

print(group)

'문제 해결 > BOJ' 카테고리의 다른 글

[백준] 원숭이 스포츠  (0) 2023.03.13
[백준] 괄호 추가하기  (0) 2023.03.11
[백준] 모양 만들기  (0) 2023.03.09
[백준] 서울 지하철 2호선  (0) 2023.03.08
[백준] 임계경로  (0) 2023.03.07