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

[백준 2151] 거울 설치(JAVA)

by 소보루:-) 2020. 3. 23.

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

 

2151번: 거울 설치

첫째 줄에 집의 크기 N (2 ≤ N ≤ 50)이 주어진다. 다음 N개의 줄에는 N개의 문자로 집에 대한 정보가 주어진다. ‘#’는 문이 설치된 곳으로 항상 두 곳이며, ‘.’은 아무 것도 없는 것으로 빛은 이 곳을 통과한다. ‘!’은 거울을 설치할 수 있는 위치를 나타내고, ‘*’은 빛이 통과할 수 없는 벽을 나타낸다.

www.acmicpc.net

 

우선순위큐를 안쓰고 그냥 큐를 써서 틀렸다..

visit배열을 3차원으로 선언해서 방향까지 체크해줬다.

거울이 있는 경우에 반시계방향 or 시계방향으로 90도 회전하는 경우를 추가해주었다.

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.PriorityQueue;
import java.util.Queue;


public class Main_bj_2151_거울설치 {

	static class Mirror implements Comparable<Mirror>{
		int x;
		int y;
		int cnt;
		int dir;
		public Mirror(int x, int y, int cnt, int dir) {
			super();
			this.x = x;
			this.y = y;
			this.cnt = cnt;
			this.dir = dir;
		}
		@Override
		public int compareTo(Mirror o) {
			return this.cnt-o.cnt;
		}
		
	}
	static int N,initX,initY;
	static char[][] map;
	static boolean[][][] visit;
	static int[] dx= {0,-1,0,1};
	static int[] dy= {-1,0,1,0};
	public static void main(String[] args) throws Exception{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		N=Integer.parseInt(br.readLine());
		map=new char[N][N];
		visit=new boolean[N][N][4];
		for(int i=0; i<N; i++) {
			String s=br.readLine();
			for(int j=0; j<N; j++) {
				map[i][j]=s.charAt(j);
				if(map[i][j]=='#') {
					initX=i;
					initY=j;
				}
			}
		}
			PriorityQueue<Mirror> q=new PriorityQueue<Mirror>();
			for(int i=0; i<4; i++) {
				
				q.offer(new Mirror(initX,initY,0,i));
			}
			
			while(!q.isEmpty()) {
			
				Mirror m=q.poll();
				int x=m.x;
				int y=m.y;
				int cnt=m.cnt;
				int dir=m.dir;
				if(visit[x][y][dir])continue;
				visit[x][y][dir]=true;
				
				if(map[x][y]=='#' && !(x==initX && y==initY)) {
					System.out.println(m.cnt);
					System.exit(0);
				}
				int nx=x+dx[dir];
				int ny=y+dy[dir];
				if(!isPossible(nx,ny))continue;
				if(map[nx][ny]=='!') {
					int nDir=0;
					//반시계회전
					if(m.dir==0) nDir=3;
					else nDir=m.dir-1;
					q.offer(new Mirror(nx,ny,cnt+1,nDir));
					//시계회전
					if(m.dir==3) nDir=0;
					else nDir=m.dir+1;
					q.offer(new Mirror(nx,ny,m.cnt+1,nDir));
					
					
				}
				//거울 설치 안하고 가기
					q.offer(new Mirror(nx,ny,m.cnt,m.dir));

			}
		}
	private static boolean isPossible(int nx,int ny) {
		if(nx<0||ny<0||nx>=N||ny>=N||
				map[nx][ny]=='*') return false;
		return true;
	}
		
}

'알고리즘 문제풀이 > 백준' 카테고리의 다른 글

[백준 9466] 텀 프로젝트(JAVA/C++)  (0) 2020.03.25
[백준 14405] 피카츄(JAVA)  (0) 2020.03.24
[백준 8979] 올림픽(JAVA)  (0) 2020.03.21
[백준 14501] 퇴사(JAVA/C++)  (0) 2020.03.20
[백준 1309] 동물원(JAVA)  (0) 2020.03.18

댓글