๐ ๋ฌธ์ ๋งํฌ
1987๋ฒ: ์ํ๋ฒณ
๐ ๋ฌธ์ ์์ฝ
์ธ๋ก R์นธ, ๊ฐ๋ก C์นธ์ธ ํ ๋ชจ์์ ๋ณด๋ํ์ด ์๋ค. ๊ฐ ์นธ์๋ ์ํ๋ฒณ ๋๋ฌธ์๊ฐ ์ ํ์๊ณ , 1ํ 1์ด์ ๋ง์ด ๋์ฌ์๋ค.
๋ง์ ์ํ์ข์ฐ 1์นธ์ฉ ์ด๋์ด ๊ฐ๋ฅํ๋ฉฐ, ์ง๊ธ๊น์ง ์ง๋์ค์ง ์์ ์ํ๋ฒณ์ด ์ ํ ์นธ์ผ๋ก๋ง ์ด๋ํ ์ ์๋ค.
์ข์ธก ์๋จ์ผ๋ก๋ถํฐ ๋ง์ด ์ต๋ ๋ช ์นธ ์์ง์ผ ์ ์๋์ง ๊ตฌํ์์ค. ๋จ, ์ข์ธก ์๋จ์ ์นด๋๋ ํฌํจ๋๋ค.
๐ฟ ํ์ด ์ค๋ช
๋์ ๋ฉํ์ ๋ค์ ํ๋ค์๋ ์ํ๋ฒณ ๋ฌธ์ ... ๐ฅน
๋ฌธ์ ํด๊ฒฐ์ ์ํ ์์์ ํ๋ฆ์ ์ด๋ฌํ๋ค.
BFS๊ฐ ์ต์ํ์ด์ deque๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด๋ณด๋ ค ํ๋ค. → deque์ appendํ๋ ํ์์ (current_x, current_y, distance, passed_alphbets (set))๋ก ํ๊ณ , visited๋ ๋ฃ๊ณ ... → ์๊ฐ ์ด๊ณผ
BFS๋ฅผ ์ ์ฐ๋๊ฐ, DFS๋ฅผ ์ ์ฐ๋๊ฐ ๊ฐ ์๊ณ ๋ฆฌ์ฆ์ ๋ชฉ์ ์ ๋ค์ ๋์ง์ด๋ณธ๋ค.
BFS๋ฅผ ์ฌ์ฉํ๋ ์ ํ์๋ ์ด๋ค ๋ง์ ์ด๋ํ๋ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ ๋ ์ฅ์ ๋ฌผ์ด ์์ด ์ํ์ข์ฐ๋ฅผ ํ์ํ ๋ค, ์ด๋์ด ๊ฐ๋ฅํ์ง ๋ถ๋ณํ๋ ๊ฒฝ์ฐ๊ฐ ์์๋ค. ์ด๋ฐ ๊ฒฝ์ฐ๋ DFS๋ฅผ ์จ๋ ๋ฌด๊ดํ๋ฐ...
๊ทธ๋ผ visited์ ๊ฐ์ [์์น, ์ด๋ ๊ฑฐ๋ฆฌ]๋ฅผ ์ ์ธํ ์ ๋ณด๊ฐ์ ๊ณ ๋ คํด๋ณด์. ํ์ํ ์ ๋ณด๋ ์ง๊ธ๊น์ง ์ง๋์จ ์ํ๋ฒณ๋ค, ์ด๋ค์ ๋ค์ ๊ฒฝ๋ก์ ์ํ๋ฒณ์ด ์ง๊ธ๊น์ง ์ง๋์จ ์ํ๋ฒณ์ ์๋์ง ํ์ธํ๊ธฐ ์ํด ํ์ํ๋ค. element in iterable์ ์๊ฐ ๋ณต์ก๋๊ฐ set์ O(1), list๋ O(N)์ด๋ฏ๋ก set์ ์ฌ์ฉํ๋ค.
โป ์ง๋์จ ์ํ๋ฒณ ๊ฒฝ๋ก๋ฅผ string์ผ๋ก ์ ์ฅํ์ฌ ํด๊ฒฐํ ๊ฒฝ์ฐ๊ฐ ์์๋ค. (string ํ์ด ๋ฐ๋ก๊ฐ๊ธฐ)
string์ ๋ค์ BFS, ๋๋ DFS๋ก ๋๊ธธ ๋ copy() ์ฐ์ฐ์ด ํ์์์ด์ set๋งํผ ์ ์ ์๊ฐ์ด ๊ฐ๋ฅํ์ง ์์๋ ์ถ์๋ฐ, ์ค์ ๋ก ์ด๊ธฐ ์๋์์ set์ ์ฌ์ฉํ๊ณ ๋ ์๊ฐ ์ด๊ณผ๊ฐ ๋ฌ์ด์ set๋ณด๋ค ๋ ์ ์ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค.
์ด ๊ณผ์ ์์, ์ง๋ฌธ ๊ฒ์ํ์ ์ฐธ๊ณ ํ์๊ณ DFS๋ฅผ ์ฌ์ฉํ์ฌ ๋์จ ์ฝ๋๋ ์๋์ ๊ฐ๋ค.
์ฝ๋ ๋ณด๊ธฐ
R, C=map(int, input().split())
board=[list(input()) for _ in range(R)]
max_dist=0
dx=[1, -1, 0, 0]
dy=[0, 0, 1, -1]
def dfs(x, y, dist, alpha_set):
global max_dist
max_dist=max(dist, max_dist)
for i in range(4):
cx=x+dx[i]
cy=y+dy[i]
if 0<=cx<R and 0<=cy<C:
if board[cx][cy] not in alpha_set:
alpha_set.add(board[cx][cy])
dfs(cx, cy, dist+1, alpha_set.copy())
alpha_set.remove(board[cx][cy])
continue
dfs(0,0,1,set(board[0][0]))
print(max_dist)
โป ์์ : ์ ์ค๋ต ์ฝ๋์์ set์ copy()ํ๋ ๊ฒ์ ์๋ฏธ๊ฐ ์๋ค.! copy()๋ฅผ ์ฐ์ง ์๊ณ ๋ค์ ์ ์ถํด๋ดค๋ ์๊ฐ ์ด๊ณผ๊ฐ ๋ฌ๋ค ๐ฅฒ ์ฝ๋ฉ ํ ์คํธ ๊ณ ์๋์ ์๊ฒฌ์ ๋ฐ๋ฅด๋ฉด, set์ด ์๋์ ์ผ๋ก ๋๋ฆฐ ์๋ฃ ๊ตฌ์กฐ๋ผ๋๋ฐ ์ ํํ ๋ด์ฉ์ ์กฐ๊ธ ๋ ์๊ฒฌ์ ์ฌ์ญ๋ ๊ฒ์ผ๋ก...
ํ์ง๋ง ์ฌ์ ํ ์๊ฐ ์ด๊ณผ ๐ญ
์๋ฆ์ ์ ๊ฒจ๋ฒ๋ฆฐ ๋ ๊ณ ๋ฏผ ํ, ์ ๋ต ์ฝ๋ ํฌ์คํ ์ ๋ณด๊ฒ ๋๋ค.
[Python] ๋ฐฑ์ค 1987๋ฒ : ์ํ๋ฒณ
https://www.acmicpc.net/problem/1987 1987๋ฒ: ์ํ๋ฒณ ์ธ๋ก R์นธ, ๊ฐ๋ก C์นธ์ผ๋ก ๋ ํ ๋ชจ์์ ๋ณด๋๊ฐ ์๋ค. ๋ณด๋์ ๊ฐ ์นธ์๋ ๋๋ฌธ์ ์ํ๋ฒณ์ด ํ๋์ฉ ์ ํ ์๊ณ , ์ข์ธก ์๋จ ์นธ (1ํ 1์ด) ์๋ ๋ง์ด ๋์ฌ ์๋ค.
codinghejow.tistory.com
์ด ํ์ด์ ํต์ฌ์ set.copy()๋ฅผ ๋ง๋ค์ง ์๋ ๊ฒ์ด๋ค.
๊ธธ์ด๊ฐ 26์ธ boolean list์ DFS, ord()๋ฅผ ํ์ฉํ์ฌ ์ด๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ์๋ค.
์ ๋ต ์ฝ๋
import sys
input=sys.stdin.readline
R, C=map(int, input().rstrip().split())
board=[[ord(x)-65 for x in input().rstrip()] for _ in range(R)]
max_dist=0
dx=[1, -1, 0, 0]
dy=[0, 0, 1, -1]
alpha=[False for _ in range(26)]
alpha[board[0][0]]=True
def dfs(x, y, dist):
global max_dist
max_dist=max(dist, max_dist)
for i in range(4):
cx=x+dx[i]
cy=y+dy[i]
if 0<=cx<R and 0<=cy<C:
if not alpha[board[cx][cy]]:
alpha[board[cx][cy]]=True
dfs(cx, cy, dist+1)
alpha[board[cx][cy]]=False
continue
dfs(0,0,1)
print(max_dist)
์ํ๋ฒณ ๊ฐฏ์๊ฐ 26๊ฐ์ด๋ฏ๋ก, ์ด๋ฅผ ํ์ฉํ๋ฉด ์ข๊ฒ ๋ค๊ณ ๋ง์ฐํ ์๊ฐํ๋๋ฐ, ord๋ก ๊ฐ ์ํ๋ฒณ์ index๋ก ์ ํํ ์ ์ด ์ฐธ์ ํ๊ฒ ๋๊ปด์ก๋ค.
์ด๋ ๊ฒ ํ๊ณ ๋, PyPy๋ฅผ ์ฌ์ฉํ์ฌ์ผ ํต๊ณผ๋์๋ค. ๐ฅน
์ฌ๋ฌ ๊ฐ์ง ๋ฌธ์ ๋ฅผ ํ๋ฉฐ, ์ ์ฉํ ํ์ด์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ง๋ค๋ ๊ฒ์ ์ค๊ฐํ๋ค.
์ด๋ฒ ๋ฌธ์ ์์๋ ord์ chr ํจ์๊ฐ ๊ทธ๋ฌํ๋ค!
'๐ป ์ปดํจํฐ๊ณตํ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Python] ๋ฐฑ์ค 9465: ์คํฐ์ปค (DP๋ DFS๋ณด๋ค ์ฐ์ ๊ณ ๋ ค๋์ด์ผ ํ๋ค.) (3) | 2024.02.07 |
---|---|
[Python] ๋ฐฑ์ค 13549: ์จ๋ฐ๊ผญ์ง 3 (์ด๊ฑธ ๊ทธ๋ํ๋ก ์ดํดํ๋ค๊ณ ?) (1) | 2024.01.27 |
[Python] 27914: ๋ธ์ค์ด์ ๊ตฌ์ฌ ์์ด์คํฌ๋ฆผ (0) | 2024.01.17 |
[Python] ๋ฐฑ์ค 2734: ๋๋ผํต ์๊ธฐ (0) | 2024.01.11 |
[Python] ๋ฐฑ์ค 1876: ํ๊ธฐ๋ ๋ณผ๋ง๊ณต (5) | 2024.01.09 |