Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- DP
- JavaScript
- 따라하며 배우는 C언어
- 따라하면서 배우는 C언어
- 생활코딩
- C언어
- String
- php
- greedy
- 따배씨
- BASIC
- BFS
- Cleancode
- BOJ
- 인프런
- graph
- Algospot
- C
- web
- Python
- server
- udemy
- programmers
- Math
- Algorithm
- dfs
- 정수론
- 종만북
- sorting
- 백준
Archives
- Today
- Total
몽상실현개발주의
[BOJ] 2186 / 문자판 / Python 파이썬 본문
[BOJ] 2186 / 문자판 / Python 파이썬
https://www.acmicpc.net/problem/2186
풀이
주어진 조건을 만족하는 모든 경로의 개수를 구하는 문제이다.
모든 경로는 DFS 를 이용하여 구현하였지만, 시간초과에 부딪히고 말았다.
모든 경로에 대한 완전탐색의 최적화는, 각 진행상황에 대해 memorization 을 해주며 중복하여 탐색하는 경우를 제거해 주어야 하였다.
그래서 visited를 2차원 배열이 아닌 3차원 배열로 만들어주고, 각 좌표값과 진행상태에 수를 저장해 주어 해결하였다.
※진행상황은 완전탐색을 하며 언제든 다시 진입 할 수 있으니, 최대한 모든 경우를 저장하는 방향으로 구현해 주어야 하였다.
import sys
input = sys.stdin.readline
N, M, K = map(int, input().split())
maps = []
for _ in range(N):
maps.append(input().rstrip())
word = input().rstrip()
visited = [[[-1] * len(word) for _ in range(M)] for _ in range(N)]
def DFS(y, x, idx):
global N, M, K, word
# 이전에 진입한 경우
if visited[y][x][idx] != -1:
return visited[y][x][idx]
# 진행상황과 글자가 맞지 않는 경우 / 다른 경로지만 같은 단계로 진입하는 경우를 고려
if maps[y][x] != word[idx]:
return 0
# 글자 탐색완료
if idx == len(word)-1:
return 1
cnt = 0
for i in range(-K, K+1):
if not i:
continue
# 최대한 모든 경우에 대해 탐색
if 0 <= y+i < N:
cnt += DFS(y+i, x, idx+1)
# 최대한 모든 경우에 대해 탐색
if 0 <= x+i < M:
cnt += DFS(y, x+i, idx+1)
visited[y][x][idx] = cnt
return cnt
res = 0
for n in range(N):
for m in range(M):
if maps[n][m] == word[0]:
res += DFS(n, m, 0)
print(res)
'Algorithm PS > BOJ' 카테고리의 다른 글
[BOJ] 5014 / 스타트링크 / Python 파이썬 (0) | 2021.08.04 |
---|---|
[BOJ] 3108 / 로고 / Python 파이썬 (0) | 2021.08.03 |
[BOJ] 2251 / 물통 / Python 파이썬 (0) | 2021.08.01 |
[BOJ] 1525 / 퍼즐 / Python 파이썬 (0) | 2021.07.28 |
[BOJ] 9019 / DSLR / Python 파이썬 (0) | 2021.07.27 |
Comments