백준(BOJ)

[Python/파이썬] - 백준(BOJ) 3709번 : 레이저빔은 어디로

phanre 2022. 6. 3. 02:49

https://www.acmicpc.net/problem/3709

 

3709번: 레이저빔은 어디로

레이저박스라는 게임은 정사각형  모양의 n x n 보드에서 진행한다. (체스판을 상상하면 된다) 레이저박스의 임의의 칸마다 우향우 거울이라는 장치가 설치되어 있고, 마지막으로 레이저 한개가

www.acmicpc.net

 

vector를 설정하여 이동하며 우향우 거울이 있는 경우 vector를 변경하여 탈출할 때 까지 시뮬레이션 하는 문제이다.

mirror라는 n*n 배열을 생성한 후 우향우 거울이 있는 위치를 저장해준다.

이후 zero index를 위한 값 변경을 한 후 dy, dx 배열을 상, 우, 하, 좌 순서로 배치한다.

그리고 시작점 위치를 토대로 방향을 설정한 후 거울이 있는지 체크해가며 이동하면 된다.

 

보드 바깥에서 출발하므로 우향우 거울로 인해 무한반복 되는 경우는 없다.

따라서 while문을 탈출할 때의 좌표를 출력하면 된다.

 

import sys
input = sys.stdin.readline

for _ in range(int(input())):
    n, r = map(int,input().split())
    mirror = [[0 for _ in range(n)] for _ in range(n)]
    for _ in range(r):
        my, mx = map(int,input().split())
        mirror[my-1][mx-1] = 1
    y, x = map(int,input().split())
    y -= 1
    x -= 1
    dy = [-1, 0, 1, 0]
    dx = [0, 1, 0, -1]
    if y == n:
        v = 0
    elif x == -1:
        v = 1
    elif y == -1:
        v = 2
    else:
        v = 3
    y += dy[v]
    x += dx[v]
    while 0 <= y < n and 0 <= x < n:
        if mirror[y][x] == 1:
            v = (v+1)%4
        y += dy[v]
        x += dx[v]
    print(y+1, x+1)