[ BOJ / Python ] 2344번 거울

황승환·2022년 6월 16일
0

Python

목록 보기
330/498


이번 문제는 단순하게 while문으로 이동하는 방법과 bfs를 이용하는 방법 두가지로 풀어보았다. 출구를 찾는 함수, 거울을 만났을 때 방향을 바꾸는 함수를 구현하였고, 이를 이용하여 이동하는 함수를 구현하였다.

  1. while문을 이용
def move(y, x, d):
    while 0<=y<n and 0<=x<m:
        if grid[y][x]==1:
            d=find_dir(d)
        y+=dy[d]
        x+=dx[d]
    answer.append(str(get_result(y, x)))
  1. bfs 이용
def move1(y, x, d):
    if grid[y][x]==1:
        d=find_dir(d)
    q=deque()
    q.append((y, x, d))
    while q:
        sy, sx, sd=q.popleft()
        ny, nx=sy+dy[sd], sx+dx[sd]
        if 0<=ny<n and 0<=nx<m:
            if grid[ny][nx]==1:
                sd=find_dir(sd)
            q.append((ny, nx, sd))
        else:
            answer.append(str(get_result(ny, nx)))

Code

from collections import deque
n, m=map(int, input().split())
grid=[list(map(int, input().split())) for _ in range(n)]
dy, dx=[-1, 0, 1, 0], [0, 1, 0, -1]
answer=[]
def get_result(y, x):
    if y==-1:
        return 2*n+2*m-x
    elif x==-1:
        return y+1
    elif y==n:
        return n+x+1
    else:
        return 2*n+m-y
def find_dir(d):
    if d==0:
        return 1
    elif d==1:
        return 0
    elif d==2:
        return 3
    else:
        return 2
def move(y, x, d):
    while 0<=y<n and 0<=x<m:
        if grid[y][x]==1:
            d=find_dir(d)
        y+=dy[d]
        x+=dx[d]
    answer.append(str(get_result(y, x)))
def move1(y, x, d):
    if grid[y][x]==1:
        d=find_dir(d)
    q=deque()
    q.append((y, x, d))
    while q:
        sy, sx, sd=q.popleft()
        ny, nx=sy+dy[sd], sx+dx[sd]
        if 0<=ny<n and 0<=nx<m:
            if grid[ny][nx]==1:
                sd=find_dir(sd)
            q.append((ny, nx, sd))
        else:
            answer.append(str(get_result(ny, nx)))
for i in range(n):
    move1(i, 0, 1)
for i in range(m):
    move1(n-1, i, 0)
for i in range(n-1, -1, -1):
    move1(i, m-1, 3)
for i in range(m-1, -1, -1):
    move1(0, i, 2)
print(*answer)

profile
꾸준함을 꿈꾸는 SW 전공 학부생의 개발 일기

0개의 댓글