[백준] 16624번 피리 부는 사나이 _ Python

2024. 3. 10. 22:45·Algorithms/Graph

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

 

16724번: 피리 부는 사나이

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

www.acmicpc.net

 

 


 

1. Preview

풀이 시간: 35분 + 30분

시간 복잡도: O(NM)

공간 복잡도: O(NM)

 

 


 

2. 초기 접근 방법

board[][] 에서 모두 방문하는데 "dfs 탐색를 진행한 횟수" 라고 생각해 풀었다.

 

3 4

DLLL

DDDU

RRRU

 

곰곰히 고민해보니, 위와 같은 case에서 dfs 탐색이 3번 일어나지만, 필요한 safezone은 1개이다.

 

 


 

3. 생각

 

그럼 어떻게 풀어야 할까?

 

각 dfs 탐색을 진행할 때마다 해당 경로에 "고유의 표식"을 남겨야 한다.

문제에서 '지도 밖으로 나가는 입력은 주어지지 않는다' 고 했으니 다시 후진을 해서라도 기존에 방문했던 노드를 다시 방문할 수 밖에 없다.

그 때, 다시 방문한 지역이 현재 경로와 일치하는지, '표식'으로 판별해 카운트 해주면 된다.

 

다시 방문한 지역이 현재 경로와 다를 시,

재방문 노드의 경로를 통해 이전에 만든 safezone으로 향하므로 별도의 카운트를 해주지 않아도 된다.

 

 


 

4. 코드

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

direction = ['L', 'R', 'U', 'D']
dx = [0, 0, -1, 1]
dy = [-1, 1, 0, 0]

def dfs(x, y, idx):
    global result

    # 이미 표식이 있는 블록이면
    if visited[x][y] != -1:
        if visited[x][y] == idx:
            result += 1
        return

    visited[x][y] = idx # 표식
    k = direction.index(board[x][y])
    dfs(x + dx[k], y + dy[k], idx)


N, M = map(int, input().split())
board = [input() for _ in range(N)]

visited = [[-1] * M for _ in range(N)]

result = 0
dfsCount = 0
for i in range(N):
    for j in range(M):
        if visited[i][j] == -1:
            dfsCount += 1
            dfs(i, j, dfsCount)

print(dfsCount)
print(result)
저작자표시 (새창열림)

'Algorithm > Graph' 카테고리의 다른 글

[백준] 9466번 텀 프로젝트 _ Python  (0) 2024.03.20
[백준] 16928번 뱀과 사다리 게임 _ Python  (0) 2024.03.17
[백준] 11559번 Puyo Puyo _ Python  (0) 2024.02.01
[백준] 1325번 효율적인 해킹 _ Python  (0) 2023.11.28
[백준] 1600번 말이 되고픈 원숭이 _ Python  (0) 2023.11.27
'Algorithms/Graph' 카테고리의 다른 글
  • [백준] 9466번 텀 프로젝트 _ Python
  • [백준] 16928번 뱀과 사다리 게임 _ Python
  • [백준] 11559번 Puyo Puyo _ Python
  • [백준] 1325번 효율적인 해킹 _ Python
wch_t
wch_t
  • wch_t
    끄적끄적(TIL)
    wch_t
  • 글쓰기 관리
  • 전체
    오늘
    어제
    • 분류 전체보기 (171)
      • Architecture (0)
      • Algorithm (67)
        • Math (5)
        • Simulation (1)
        • Data Structure (4)
        • DP (7)
        • Brute Fource (10)
        • Binary Search (6)
        • Greedy (2)
        • Graph (11)
        • Mst (1)
        • Shortest path (10)
        • Two Pointer (1)
        • Tsp (3)
        • Union Find (2)
        • Mitm (1)
      • CS (2)
        • 데이터베이스 (5)
        • 네트워크 (5)
      • DB (6)
      • DevOps (17)
        • AWS (9)
        • Docker (1)
        • CI-CD (5)
      • Error (1)
      • Project (0)
        • kotrip (0)
      • Spring (59)
        • 끄적끄적 (5)
        • 기본 (9)
        • MVC 1 (7)
        • MVC 2 (11)
        • ORM (8)
        • JPA 1 (7)
        • JPA 2 (5)
        • Spring Data Jpa (7)
      • Test (2)
      • TIL (6)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    aws secrets manager
    Jenkins
    scope
    spring-cloud-starter-bootstrap
    Sxssf
    Merge
    spring-cloud-starter-aws-secrets-manager-config
    view algorithm
    docker
    form_post
    docker: not found
    apache poi
    TempTable
    백준 3015 파이썬
    백준 17289 파이썬
    백준 17299 파이썬
    response_mode
    애플
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.3
wch_t
[백준] 16624번 피리 부는 사나이 _ Python
상단으로

티스토리툴바