yuns

[20419] 화살표 미로 (Easy) python 파이썬 본문

algorithms/백준

[20419] 화살표 미로 (Easy) python 파이썬

yuuuun 2022. 5. 16. 16:57
반응형

문제: https://www.acmicpc.net/problem/20419

입력

r, c = 가로, 세로 길이

k = 0, 1(0이면 주문서 없음, 1이면 주문서 있음)

아이디어

k = 0 일때는 도착 할 수 있는지 간단하게 확인하기

k = 1일 때는,

  • visited의 크기를 r x c x 4와 같이 정의 한 뒤, 마지막의 위치를 k라 할 때, ( 0: 한 개도 안 씀, 1: 오른쪽 하나 씀, 2: 왼쪽 하나 씀, 3: 왼, 오른 다 씀 )
  • 오른쪽을 한 번도 안 쓸 경우, 해당 값을 queue에 넣기
  • 왼쪽을 한번도 안 쓸 경우, 해당 값을 queue에 넣기

code

from collections import deque
r, c, k = map(int, input().split())
dxy = [[-1, 0], [0, -1], [1, 0], [0, 1]] # 위, 왼, 아래, 오른쪽
dic = {'U': 0, 'D': 2, 'L': 1, 'R': 3}
maps = []
for _ in range(r):
    maps.append(list(map(lambda x:dic[x], list(input()))))

if k == 0:
    q = deque()
    q.append([0, 0])
    visited = [[False] * c for _ in range(r)]
    visited[0][0] = True
    while q:
        x, y = q.popleft()
        d = maps[x][y]
        nx, ny = x + dxy[d][0], y + dxy[d][1]
        if 0 <= nx < r and 0 <= ny < c and not visited[nx][ny]:
            q.append([nx, ny])
            visited[nx][ny] = True

    if visited[-1][-1]:
        print('Yes')
    else:
        print('No')
else:
    q = deque()
    q.append([0, 0, 0])
    # 0: 한 개도 안 씀, 1: 오른쪽 하나 씀, 2: 왼쪽 하나 씀, 3: 왼, 오른 다 씀
    visited = [[[False] * 4 for _ in range(c)] for _ in range(r)]
    visited[0][0][0] = True
    while q:
        x, y, k = q.popleft()
        d = maps[x][y]
        nx, ny = x + dxy[d][0], y + dxy[d][1]
        # 이어서 할 경우
        if 0 <= nx < r and 0 <= ny < c and not visited[nx][ny][k]:
            q.append([nx, ny, k])
            visited[nx][ny][k] = True

        # 왼쪽꺼 쓰지 않은 경우
        if k & 1 == 0:
            nk = k | 1
            nd = (d + 1) % 4
            nx, ny = x + dxy[nd][0], y + dxy[nd][1]
            if 0 <= nx < r and 0 <= ny < c and not visited[nx][ny][nk]:
                q.append([nx, ny, nk])
                visited[nx][ny][nk] = True
        # 오른쪽 꺼 쓰지 않은 경우
        if k & 2 == 0:
            nk = k | 2
            nd = (d - 1) % 4
            nx, ny = x + dxy[nd][0], y + dxy[nd][1]
            if 0 <= nx < r and 0 <= ny < c and not visited[nx][ny][nk]:
                q.append([nx, ny, nk])
                visited[nx][ny][nk] = True
    
    if set(visited[-1][-1]) == {False}:
        print('No')
    else:
        print('Yes')
반응형

'algorithms > 백준' 카테고리의 다른 글

[1379] 강의실2 파이썬 python  (1) 2022.05.30
[23291] python 어항 정리  (0) 2022.03.10
[19238] python 스타트 택시  (0) 2022.03.01
[23288] python 주사위 굴리기2  (0) 2022.03.01
[23289] python 주사위 굴리기  (0) 2022.03.01
Comments