[파이썬] 백준 17267: 상남자 (플레5)
풀이
방향성 생각
- 유니온 파인드로 세로단위 + 벽으로 나뉜 구분으로 나눠서 유니온 파인드로 풀려고 했다
- 단위가 세로랑 벽으로 나뉘면 애초에 같은 노드라고 구분지을 수 있어서 0-1너비우선처럼 풀이
- 세로로 이동하면 덱 맨 앞으로, 가로로 이동하면 덱 맨 뒤로 넣기.
전체코드
from collections import deque
import sys
input = lambda : sys.stdin.readline().rstrip()
inside = lambda x,y : 0<=x<W and 0<=y<H
dire = [(1,0),(0,1),(-1,0),(0,-1)]
H,W = map(int,input().split())
left,right = map(int,input().split())
arr_raw = [list(input()) for _ in range(H)]
arr = []
# int로 변환
for i in range(H):
arr.append(list(map(int,arr_raw[i])))
for j in range(W):
if arr_raw[i][j] == '2':
sx,sy = j,i
# x,y,남은 left이동, 남은right이동
Q = deque([(sx,sy,left,right)])
V = [[False]*W for _ in range(H)]
V[sy][sx] = True
while Q:
x,y,l,r = Q.popleft()
for idx,(dx,dy) in enumerate(dire):
nx,ny = x+dx,y+dy
is_ver = idx%2
if inside(nx,ny) and not V[ny][nx] and arr[ny][nx] != 1:
if is_ver:
V[ny][nx] = True
Q.appendleft((nx,ny,l,r))
else:
if idx==0 and r:
V[ny][nx] = True
Q.append((nx,ny,l,r-1))
elif idx==2 and l:
V[ny][nx] = True
Q.append((nx,ny,l-1,r))
answer = sum(sum(V[i]) for i in range(H))
print(answer)
코멘트
- .
'Algorithm > Graph' 카테고리의 다른 글
[파이썬] 백준 16952 : 체스판 여행 2 (플레4) (0) | 2024.12.07 |
---|---|
[파이썬] 백준 16959 : 체스판 여행 1 (플레5) (0) | 2024.12.06 |
[파이썬] 백준 16930 : 달리기 (플레3) (0) | 2024.11.29 |
[파이썬] 백준 1981 : 배열에서 이동 (플레5) (0) | 2024.11.28 |
[파이썬] 백준 2325 : 개코전쟁 (플레5) (0) | 2024.11.27 |
[파이썬] 백준 28032: Filed Day (플레2) (0) | 2024.11.26 |
[파이썬] 백준 1473 : 미로 탈출 (플레5) (0) | 2024.11.26 |
댓글