1. 문제
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 |