๋ฌธ์
https://www.acmicpc.net/problem/20166
๋ฐฑ์ค ๋ฌธ์ ์ง - 0x15๊ฐ - ํด์
์๊ณ ๋ฆฌ์ฆ: ํด์๋ฅผ ์ฌ์ฉํ ์งํฉ๊ณผ ๋งต, ๊น์ด ์ฐ์ ํ์(DFS), ๊ทธ๋ํ ํ์, ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ
ํ์ด
์ฃผ์๊น๊ฒ ๋ด์ผ ํ ์กฐ๊ฑด์ ๋ค์๊ณผ ๊ฐ๋ค.
- ๋ฐฉ๋ฌธํ๋ ๊ณณ์ ๋ค์ ๋ฐฉ๋ฌธ ๊ฐ๋ฅ
- ํํ ๊ตฌ์กฐ๋ก ์ด๋ฃจ์ด์ง ์ขํ
- ์กฐํฉ์ด ์๋ ์์ด (์์๊ฐ ๋ค๋ฅด๋ฉด ๋ค๋ฅธ๊ฒ์ผ๋ก ๊ณ์ฐ)
- ๋๊ฐ์ ์ด๋ ๊ฐ๋ฅ
๋ํ ๋จ์ด๋ ์ค๋ณต์ผ๋ก ์ฃผ์ด์ง ์ ์์ผ๋ฏ๋ก, ๋์
๋๋ฆฌ์ ์ด๋ฏธ ๊ณ์ฐ๋ ๊ฐ์ด ์๋ค๋ฉด ํ์ํ ํ์ ์์ด ๊ทธ ๊ฐ์ ์ถ๋ ฅํด์ฃผ๋ฉด ๋๋ค.
์๋ค๋ฉด ์๋์ ํ์ ๊ณผ์ ์ ์งํํ๋ค.
- ๋จ์ด์ ์ฒซ ๋ฌธ์์ ์ผ์นํ๋ ์ขํ๋ค์ ๋ฆฌ์คํธ์ ์ ์ฅํ๋ค.
- ๋ง์ฝ ๋จ์ด์ ๊ธธ์ด๊ฐ 1์ด๋ผ๋ฉด ๋ฆฌ์คํธ์ ๊ธธ์ด๋ฅผ ๋์ ๋๋ฆฌ์ ์ ์ฅ ํ ์ถ๋ ฅ.
- ์๋๋ผ๋ฉด, ์ ์ฅํ ์ขํ๋ฅผ ํ๋์ฉ ๊บผ๋ด๋ฉฐ DFS๋ฅผ ์งํํ๋ค.
(๋จ์ด, ๋ค์ ์ธ๋ฑ์ค, x, y)
- ๋๊ฐ์ ํฌํจ 8๊ฐ์ ๋ฐฉํฅ์ ํ์ํ๋ค.
- ํด๋น ์ขํ์ ๊ฐ๊ณผ ์ฐพ๊ณ ์ ํ๋ ๋จ์ด[์ธ๋ฑ์ค]์ ๊ฐ์ด ์ผ์นํ๋ค๋ฉด DFS๋ฅผ ์คํํ๋ค.
- ์ธ๋ฑ์ค๊ฐ ๋จ์ด์ ๊ธธ์ด์ ๊ฐ์์ง๋ฉด ์นด์ดํ +1 ํ ๋ฆฌํด.
์ ์ฒด ์ฝ๋
# ๋ฉ๋ชจ๋ฆฌ: 32412KB / ์๊ฐ: 364ms
from sys import stdin
input = stdin.readline
N, M, K = map(int, input().split())
field = [input().rstrip() for _ in range(N)]
words = [input().rstrip() for _ in range(K)]
count = {word: 0 for word in words}
dx = [-1, -1, 0, 1, 1, 1, 0, -1]
dy = [0, 1, 1, 1, 0, -1, -1, -1]
def dfs(target, idx, x, y):
if idx == len(target): # ์ธ๋ฑ์ค๊ฐ word์ ๊ธธ์ด์ ๊ฐ์์ง๋ฉด ์นด์ดํธ ์ถ๊ฐ
count[target] += 1
return
for i in range(8):
nx = (x + dx[i]) % N
ny = (y + dy[i]) % M
# ๋ค์์ ์ฌ ๋ฌธ์์ (nx, ny)์ ๊ฐ์ด ์ผ์นํ๋ค๋ฉด dfs ์คํ
if field[nx][ny] == target[idx]:
dfs(target, idx+1, nx, ny)
for word in words:
# ์์ ์นด์ดํ
ํ๋ ๋จ์ด์ผ๊ฒฝ์ฐ ๊ตฌํด๋์๋ ๊ฐ์ ๊ทธ๋๋ก ์ถ๋ ฅ
if count[word] > 0:
print(count[word])
continue
# ๋จ์ด์ ์ฒซ ๋ฌธ์์ ์ผ์นํ๋ ์ขํ๋ค์ ์ ์ฅ
start = []
for i in range(N):
for j in range(M):
if field[i][j] == word[0]:
start.append((i, j))
if len(word) == 1: # ๋จ์ด์ ๊ธธ์ด๊ฐ 1์ผ๊ฒฝ์ฐ
print(len(start))
else:
for x, y in start: # ๋ค์ ์ธ๋ฑ์ค๋ฅผ ๋ฃ๊ณ dfs ์คํ
dfs(word, 1, x, y)
print(count[word])
์ฐธ๊ณ ๋ก ์ ํ์ด ๋ฐฉ์ ๊ทธ๋๋ก ์ ์ถํ๋ค๊ฐ 6๋ฒ์ ๋ ๋น ๊พธ๋จน์๋ค.
์๊ณ ๋ณด๋ ๋จ์ด๋ค์ ๋์
๋๋ฆฌ๋ก ์
๋ ฅ๋ฐ๋ ๋ฐ๋์ ์ค๋ณต ๋จ์ด ์ฒ๋ฆฌ๊ฐ ์๋๋๊ฒ^^;;
์์์ ํ๋ฆ๋๋ก ํ๋ค ๋ณด๋ ๊ทธ๋ฐ๊ฒ๊ฐ์๋ฐ... ๋๋ถ์ ์กฐ๊ธ ์ฌ๋ํ์๋ค.
์๋ฌดํผ ๊ทธ ๊ณผ์ ์์ ๋ค๋ฅธ ํ์ด๋ค์ ์ฐพ์๋ดค์๋๋ฐ, ์์ ํ์์ผ๋ก ํผ ๋ถ๋ค์ด ๊ฝค ๋ง์๋ค.
์์ ํ์์ผ๋ก ํผ ์ฝ๋
# ๋ฉ๋ชจ๋ฆฌ: 53232KB / ์๊ฐ: 940ms
from sys import stdin
input = stdin.readline
N, M, K = map(int, input().split())
field = [input().rstrip() for _ in range(N)]
words = [input().rstrip() for _ in range(K)]
parts = {}
dx = [-1, -1, 0, 1, 1, 1, 0, -1]
dy = [0, 1, 1, 1, 0, -1, -1, -1]
def dfs(x, y, depth, word: str):
if depth > 5: # ๋ฌธ์์ด์ ์ต๋ 5๊ธ์
return
# if word in words ์กฐ๊ฑด์ ๋ฃ์ผ๋ฉด ์๊ฐ์ด๊ณผ.
parts[word] = parts.get(word, 0) + 1
for i in range(8):
nx = (x + dx[i]) % N
ny = (y + dy[i]) % M
dfs(nx, ny, depth+1, word + field[nx][ny])
for i in range(N):
for j in range(M):
dfs(i, j, 1, field[i][j])
for word in words:
print(parts.get(word, 0))
์ขํ ํ๋ํ๋์ฉ DFS๋ฅผ ์คํํ๋ ๋ฐฉ์์ด๋ค.
DFS๋ฅผ ์คํํ ๋๋ง๋ค ๋ฌธ์๋ฅผ ํ๋์ฉ ์ถ๊ฐํด๋๊ฐ๋ฉฐ, ํ์ฌ๊น์ง์ ๋ฌธ์๋ฅผ ๋์
๋๋ฆฌ๋ก ์นด์ดํธํ๋ค.
ex) "frog" => dic["f"] += 1
=> dic["f + ์ฐพ์๋ฌธ์"] += 1
...
๋ชจ๋ DFS๋ฅผ ๋๋ธ ํ ๋จ์ด๋ค์ ์ํํ๋ฉฐ ๋์ ๋๋ฆฌ์ ์ ์ฅํด๋จ๋ ๊ฐ์ ์ถ๋ ฅํ๋ค. (์์ผ๋ฉด 0)
๋ฉ๋ชจ๋ฆฌ/์๊ฐ์ ์ฒ์ ๋ฐฉ์๊ณผ 3๋ฐฐ ์ ๋ ์ฐจ์ด๋๋ค.
ํ์ง๋ง ์๊ฐ์ด๊ณผ ์์ด ํต๊ณผ๋๋ฏ๋ก ์ด๋ค ๋ฐฉ์์ ์ ํํ๋ ์๊ด์ ์์๋ฏํ๋ค.