장 준
씨포유
장 준
전체 방문자
오늘
어제
  • 분류 전체보기 (91)
    • 프로그래밍언어 (15)
      • c언어 (10)
      • 파이썬 (0)
      • 자바스크립트 (5)
    • PS (58)
      • 알고리즘 이론 (18)
      • 프로그래머스 (5)
      • 백준 (35)
    • CS (16)
      • 자료구조 (5)
      • 운영체제 (3)
      • 네트워크 (5)
      • 데이터베이스 (0)
      • 기초 지식 (3)
    • 브랜드 (1)

블로그 메뉴

  • 태그

인기 글

태그

  • JS
  • 백준
  • 자료구조
  • codesandbox
  • recursion
  • pypy3
  • DP
  • C
  • DFS
  • BFS
  • 프로그래밍언어
  • 기초 지식
  • 코딩테스트
  • Priority Queue
  • Visual Studio
  • nodejs
  • 자바스크립트
  • Implementation
  • PS
  • CS
  • 프로그래머스
  • 씨포유
  • 알고리즘
  • JavaScript
  • Kruskal algorithm
  • 파이썬
  • Network
  • Stack
  • python3
  • bitmask

최근 댓글

최근 글

hELLO · Designed By 정상우.
장 준

씨포유

[백준(BOJ)] #1103- 게임 (파이썬, PyPy3)
PS/백준

[백준(BOJ)] #1103- 게임 (파이썬, PyPy3)

2022. 11. 2. 11:24
728x90

문제

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

 

1103번: 게임

줄에 보드의 세로 크기 N과 가로 크기 M이 주어진다. 이 값은 모두 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에 보드의 상태가 주어진다. 쓰여 있는 숫자는 1부터 9까지의 자연수 또는

www.acmicpc.net

 


문제 풀이

처음에 DFS 알고리즘을 적용하여 풀었는데 시간 초과가 발생했습니다. 다른 풀이를 참고하여 DP를 함께 적용하여 풀 수 있다는 것을 알았습니다. 문제 풀이는 다음 이 블로그의 풀이를 참고하여 풀었습니다.

 

2022.07.12 - [PS/알고리즘 이론] - [파이썬으로 배우는 알고리즘] DFS(깊이 우선 탐색)

 

[파이썬으로 배우는 알고리즘] DFS(깊이 우선 탐색)

DFS란? DFS(Depth First Search)는 그래프의 모든 노드를 탐색하는 방법 중 하나로, 깊이를 우선으로 탐색한 후 더 이상 탐색할 노드가 없다면 이전으로 돌아가 탐색을 이어나가는 탐색 알고리즘입니다.

c4u-rdav.tistory.com

2022.07.22 - [PS/알고리즘 이론] - [파이썬으로 배우는 알고리즘] 동적 계획법(Dynamic Programming)

 

[파이썬으로 배우는 알고리즘] 동적 계획법(Dynamic Programming)

동적 계획법(Dynamic Programming)이란? 동적 계획법(Dynamic Programming), 다이나믹 프로그래밍, DP라고 불리는 이 알고리즘은 무엇일까요?? 동적 프로그래밍? 저는 이 말을 처음 접했을 때 의미에 대해 생

c4u-rdav.tistory.com

 

1) DFS 알고리즘으로 탐색하여 동전을 최대 몇 번 움직일 수 있는지를 기본으로 한다.

2) 이미 탐색한 곳을 한 번 더 탐색하는 경우는 무한 번 움직일 수 있다는 것을 의미하므로 재방문한 경우는 -1을 출력하고 종료한다.

3) dp 테이블을 이용하여 탐색하는 지점에 저장되어 있는 움직인 횟수가 현재 움직인 횟수보다 크다면 더 이상 탐색하지 않는다. 즉, 이전보다 움직인 횟수가 많은 경우에만 탐색을 진행한다.

 


구현

코드

import sys
input = sys.stdin.readline

if __name__ == "__main__":
    N, M = map(int, input().split())
    board = [list(input().rstrip()) for _ in range(N)]
    visited = [[False] * M for _ in range(N)]
    dp = [[0] * M for _ in range(N)]
    dx = [-1, 0, 1, 0]
    dy = [0, 1, 0, -1]
    max_cnt = 0

    def dfs(tx, ty, cnt):
        global max_cnt
        max_cnt = max(max_cnt, cnt)
        for k in range(4):
            # 네 방향으로 좌표 이동
            x = tx + dx[k] * int(board[tx][ty])
            y = ty + dy[k] * int(board[tx][ty])
            # 움직인 좌표가 범위 안에 있으면서 구멍이 아니고 이전보다 움직인 횟수가
            # 많은 경우에만 탐색 진행
            if 0 <= x < N and 0 <= y < M and board[x][y] != 'H' and cnt + 1 > dp[x][y]:
                # 탐색한 지점이 이미 방문한 지점이면 -1 출력하고 종료
                if visited[x][y]:
                    print(-1)
                    exit()
                else:
                    # 방문 처리
                    visited[x][y] = True
                    dp[x][y] += 1
                    # 움직임
                    dfs(x, y, cnt + 1)
                    # 백트래킹
                    visited[x][y] = False
    dfs(0, 0, 0)
    print(max_cnt + 1)

결과

728x90
반응형
저작자표시 (새창열림)

'PS > 백준' 카테고리의 다른 글

[백준(BOJ)] #10844- 쉬운 계단 수 (파이썬, PyPy3)  (0) 2022.11.07
[백준(BOJ)] #1525- 퍼즐 (파이썬, PyPy3)  (0) 2022.11.03
[백준(BOJ)] #1194- 달이 차오른다, 가자. (파이썬, PyPy3)  (2) 2022.10.30
[백준(BOJ)] #1655- 가운데를 말해요 (파이썬, PyPy3)  (0) 2022.10.20
[백준(BOJ)] #1300- K번째 수 (파이썬, PyPy3)  (0) 2022.10.19
    'PS/백준' 카테고리의 다른 글
    • [백준(BOJ)] #10844- 쉬운 계단 수 (파이썬, PyPy3)
    • [백준(BOJ)] #1525- 퍼즐 (파이썬, PyPy3)
    • [백준(BOJ)] #1194- 달이 차오른다, 가자. (파이썬, PyPy3)
    • [백준(BOJ)] #1655- 가운데를 말해요 (파이썬, PyPy3)
    장 준
    장 준
    C4U(Computer For You)

    티스토리툴바