본문 바로가기
알고리즘/백준

[JAVA]3709_레이저빔은 어디로

by 박 현 황 2021. 3. 17.

문제링크

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

 

3709번: 레이저빔은 어디로

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

www.acmicpc.net

 

 

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main {

	static int N,R;
	static int map[][];
	static int dir;
	static int resX,resY;
	static int dx[]= {-1,0,1,0};
	static int dy[] = {0,1,0,-1};
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		
		 int T = Integer.parseInt(br.readLine()); //테스트 케이스 개수
		 for(int t=0;t<T;t++) {
			 st = new StringTokenizer(br.readLine());
			 N = Integer.parseInt(st.nextToken()); // 보드의 크기
			 R = Integer.parseInt(st.nextToken()); //우향우 거울의 개수
			 map = new int[N+2][N+2]; //레이저 좌표까지 더하기 위해 //좌표는 1부터 시작
			 
			 resX = 0;
			 resY = 0;
			 
			 for(int r=0;r<R;r++) {
				 st = new StringTokenizer(br.readLine());
				 //우향우 거울 좌표 입력
				 int row = Integer.parseInt(st.nextToken());
				 int col = Integer.parseInt(st.nextToken());
				 map[row][col] = 1;
			 }
			 //레이저 위치 입력
			 st = new StringTokenizer(br.readLine());
			 int row = Integer.parseInt(st.nextToken());
			 int col = Integer.parseInt(st.nextToken());
			 map[row][col] = 2; //레이저는 2로 표시
			 
			 int nx=0,ny=0;
			 if(col == 0) dir = 1; //위로
			 else if(col == (N+2)-1)  dir = 3; //왼쪽으로
			 else if(row == 0) dir = 2; //아래로
			 else if(row == (N+2)-1) dir = 0;
			 dfs(row,col,dir,0);
			 System.out.println(resX+" "+resY);
			
			 
		 }
		 
		 //col == 0 ->오른쪽
		 //col == (N+2)-1 ->왼쪽
		 //row == 0->아래로
		 //row == (N+2)-1 ->위로
	}
	
	static boolean dfs(int row,int col,int dir,int cnt) {
		
		if(cnt >N*N) return true;
		int nx = row + dx[dir];
		int ny = col + dy[dir];
		
		if(nx<1 || nx>N || ny<1 || ny>N) {
			resX = nx;
			resY = ny;
			return true;
		}
		
		if(map[nx][ny] !=1) dfs(nx,ny,dir,cnt);
		else dfs(nx,ny,(dir+1)%4,cnt+1);
		
		return false;
	}
}

 

중간에 레이저 표시가 필요할 까 싶어서 따로 표시해주었는데

레이저 표시는 따로 필요가 없었다!

 

DFS돌리면서 보드 밖을 벗어나면 벗어난 위치를 resX,resY에 저장해주었다.

만약 계속 보드 안에서 뱅글뱅글 돈다면 0을 출력해주어야하는데 이 부분은 중간에 N*N만큼 돌면 뱅글뱅글 돈다고 판단하고 return하여 출력해주었다.

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

[JAVA]백준_1717_집합의표현  (0) 2021.03.19
[JAVA]백준_14889_스타트와 링크  (0) 2021.03.17
[JAVA]백준_1260_DFS와 BFS  (0) 2021.03.16
[JAVA]백준_7569_토마토  (0) 2021.03.15
[JAVA]백준_7576_토마토  (0) 2021.03.15