ํฐ์คํ ๋ฆฌ ๋ทฐ
๋ฌธ์
๋ฌธ์ ํ์ด
๋ชฉํ๊ฐ ๋๋ ๋ฌธ์์ด๊ณผ ์ผ์นํ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ์ฐพ๋ ๋ฌธ์ ์ด๋ค. ์ด๋ฅผ ์ํด์ `์, ํ, ์ข, ์ฐ`๋ก K ๋งํผ์ฉ ์ด๋ํ ์ ์๋ค. ๋ฌธ์ ๋ฅผ ํ๊ธฐ ์ํด์๋ ๋จ์ํ DFS๋ฅผ ํตํด ๊ฒฝ์ฐ์ ์๋ฅผ ์ฐพ๊ฒ ๋๋ฉด ์๊ฐ ์ด๊ณผ๊ฐ ๋ฐ์ํ๋ค. ๋ฐ๋ผ์ ๋ฉ๋ชจ์ด์ ์ด์ ์ ํตํด ์ด๋ฏธ ์ฒดํฌํ ๊ฒฝ์ฐ์ ์๋ผ๋ฉด ํด๋น ๊ฒฝ์ฐ์ ์๋ฅผ ์ฒดํฌํ์ง ์์์ผ(๊ฐ์ง์น๊ธฐ) ํ๋ค.
์ฒ์์๋ `dirs = ((0, 1), (0, -1), (-1, 0), (1, 0))`๋ฅผ ์ฌ์ฉํ์ฌ ํ ๋ฐฉํฅ์ฉ ์ฒดํฌํ๋๋ก ํ์๋๋ Python3์์ ์๊ฐ์ด๊ณผ๊ฐ ๋ฐ์ํ์๋ค. ๋ค๋ฅธ ์ฌ๋๋ค์ ํ์ด๋ฅผ ๋ณด๋, ๋ฐฉํฅ์ ์ ๊ทผํ ๋, `next_x`, `next_y`์ ๋ฐ๋ผ ๋ ๊ฐ์ง์ ๊ฐ์ง๋ก ๋ป๋ ๊ฒฝ์ฐ๋ก ํธ๋ ๊ฒ์ด ๋ ํจ์จ์ ์ด๋ผ๋ ๊ฒ์ ์๊ณ ์ฝ๋๋ฅผ ์์ ํ์๋ค.
์ฝ๋
sys import stdin
def dfs(loc, idx):
global answer
x, y = loc
# ๊ฐ์ง์น๊ธฐ 1: ์ด๋ฏธ ์ฒดํฌํ ๊ฒฝ์ฐ
if check[x][y][idx] != -1:
return check[x][y][idx]
# ๊ฐ์ง์น๊ธฐ 2: target ๋ฌธ์์ ์ผ์นํ์ง ์์ ๊ฒฝ์ฐ
if board[x][y] != target[idx]:
check[x][y][idx] = 0
return 0
# ์ฐพ๋ ๋ฌธ์์ ์ผ์นํ๋ ๊ฒฝ์ฐ
if idx == len(target) - 1:
return 1
cur_answer = 0
for k in range(-K, K + 1):
if not k:
continue
next_x, next_y = x + k, y + k
if 0 <= next_x < N:
cur_answer += dfs((next_x, y), idx + 1)
if 0 <= next_y < M:
cur_answer += dfs((x, next_y), idx + 1)
check[x][y][idx] = cur_answer
return check[x][y][idx]
if __name__ == '__main__':
answer = 0
N, M, K = map(int, stdin.readline().split())
board = [stdin.readline().strip() for _ in range(N)]
target = stdin.readline().strip()
dirs = ((0, 1), (0, -1), (-1, 0), (1, 0))
check = [[[-1] * len(target) for _ in range(M)] for _ in range(N)]
for i in range(N):
for j in range(M):
if board[i][j] == target[0]:
answer += dfs((i, j), 0)
print(answer)
'๐จโ๐ป ์ฝ๋ฉํ ์คํธ > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฐฑ์ค: 20056 ๋ง๋ฒ์ฌ ์์ด์ ํ์ด์ด๋ณผ (0) | 2021.04.05 |
---|---|
๋ฐฑ์ค: 17135 ์บ์ฌ ๋ํ์ค (0) | 2021.04.04 |
๋ฐฑ์ค: 20057 ๋ง๋ฒ์ฌ ์์ด์ ํ ๋ค์ด๋ (0) | 2021.03.31 |
๋ฐฑ์ค: 17140 ์ด์ฐจ์ ๋ฐฐ์ด๊ณผ ์ฐ์ฐ (0) | 2021.03.28 |
๋ฐฑ์ค: 8980 ํ๋ฐฐ (0) | 2021.03.19 |