1. 문제

www.acmicpc.net/problem/2151

 

2151번: 거울 설치

첫째 줄에 집의 크기 N (2 ≤ N ≤ 50)이 주어진다. 다음 N개의 줄에는 N개의 문자로 집에 대한 정보가 주어진다. ‘#’는 문이 설치된 곳으로 항상 두 곳이며, ‘.’은 아무 것도 없는 것으로 빛은

www.acmicpc.net

2. 접근방법

pq를 이용해 mirror사용이 적었던 빛부터 나오게 하면 되는 문제

 

몇 가지 주의 할 것이

 

! 위치에서 mirror 사용을 반드시 할 필요는 없다는 것

-> mirror를 사용해 들어온 방향의 왼,오로 갈 수 있고 사용없이 직진 할 수 있음 3방향 추가

 

visit 처리를 빛이 오는 4방향에 대해서 다 해주어야 한다는 것

 

3. 자바 코드

package Gold;

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

public class G4_2151거울설치 {
	static class light implements Comparable<light> {
		int x;
		int y;
		int mirror;
		int dir;

		public light(int x, int y, int mirror, int dir) {
			this.x = x;
			this.y = y;
			this.mirror = mirror;
			this.dir = dir;
		}

		@Override
		public int compareTo(light o) {
			return this.mirror - o.mirror;
		}

	}

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int N = Integer.parseInt(br.readLine());
		char map[][] = new char[N][N];
		light start = null;
		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] == '#')
					start = new light(i, j, 0, 0);
			}
		}
		PriorityQueue<light> pq = new PriorityQueue<light>();
		boolean visit[][][] = new boolean[4][N][N];
		for (int i = 0; i < 4; i++) {
			pq.add(new light(start.x, start.y, 0, i));
			visit[i][start.x][start.y] = true;
		}

		int dr[] = { -1, 0, 1, 0 };
		int dc[] = { 0, 1, 0, -1 };
		int ans = 0;
		gg: while (!pq.isEmpty()) {
			light now = pq.poll();
			for (int i : new int[] { -1, 1,0 }) {
				if(map[now.x][now.y]!= '!' && i != 0  )
					continue;
				int dir = (now.dir + i + 4) % 4;
				int row = now.x + dr[dir];
				int col = now.y + dc[dir];
				int mirror = i == 0 ? now.mirror : now.mirror + 1;
				if (row < 0 || col < 0 || row >= N || col >= N || map[row][col] == '*')
					continue;
				if (visit[dir][row][col])
					continue;
				if (map[row][col] == '#') {
					ans = mirror;
					break gg;
				}
				visit[dir][row][col] = true;
				pq.add(new light(row, col, mirror, dir));
			}

		}
		System.out.println(ans);

	}

}

4. 마치며

처음에 문제 이해를 잘못해서 삽질 좀 했는데

결국은 bfs에서 분기 나누기만 잘하면 되는 문제

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

[백준] 16988 Baaaaaaaaaduk2  (2) 2021.01.21
[백준] 20127 Y-수열  (0) 2021.01.18
[백준] 17140 이차원 배열과 연산  (0) 2021.01.16
[백준] 5014 스타트링크  (0) 2021.01.13
[백준] 19584 난개발  (0) 2021.01.02

+ Recent posts