크기가 1×1인 정사각형으로 나누어진 W×H 크기의 지도가 있다. 지도의 각 칸은 빈 칸이거나 벽이며, 두 칸은 'C'로 표시되어 있는 칸이다.
'C'로 표시되어 있는 두 칸을 레이저로 통신하기 위해서 설치해야 하는 거울 개수의 최솟값을 구하는 프로그램을 작성하시오. 레이저로 통신한다는 것은 두 칸을 레이저로 연결할 수 있음을 의미한다.
레이저는 C에서만 발사할 수 있고, 빈 칸에 거울('/', '\')을 설치해서 방향을 90도 회전시킬 수 있다.
아래 그림은 H = 8, W = 7인 경우이고, 빈 칸은 '.', 벽은 '*'로 나타냈다. 왼쪽은 초기 상태, 오른쪽은 최소 개수의 거울을 사용해서 두 'C'를 연결한 것이다.
첫째 줄에 W와 H가 주어진다. (1 ≤ W, H ≤ 100)
둘째 줄부터 H개의 줄에 지도가 주어진다. 지도의 각 문자가 의미하는 것은 다음과 같다.
첫째 줄에 C를 연결하기 위해 설치해야 하는 거울 개수의 최솟값을 출력한다.
7 8
.......
......C
......*
*.
......
......
.C....
.......
3
진심 역대급 헤맸던 문제... 아무리 해도 실패에 메모리 초과에..
구글링해서 찾아본 해답들도 메모리 초과가 계속 나서 진짜 반나절동안 붙잡고 자존감 팍팍 떨어뜨린 문제다... ㅜㅜ
결론으로는 직선으로 최대한 이동할 수 있을 만큼 이동하는 식으로 배열을 방문하면 해결되는 문제였다.
지금 정신이 없어서 이해가 안된다면 아래 링크 방문해서 해결하신 방법을 보면 될 것 같다.
왜 알고리즘은 해도해도 끝이 없지?
https://bloofer.net/76
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine());
int[] data = new int[n];
for (int i = 0; i < n; i++) {
data[i] = Integer.parseInt(st.nextToken());
}
int pos = n - 1;
while(pos > 0 && data[pos - 1] > data[pos]){
pos--;
}
int mPos = pos;
iimport java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int w = Integer.parseInt(st.nextToken());
int h = Integer.parseInt(st.nextToken());
char[][] map = new char[h][w];
Pair str = null;
Pair dest = null;
for (int i = 0; i < h; i++) {
char[] temp = br.readLine().toCharArray();
for (int j = 0; j < w; j++) {
if (temp[j] == 'C' && str == null)
str = new Pair(i, j);
else if (temp[j] == 'C' && str != null)
dest = new Pair(i, j);
map[i][j] = temp[j];
}
}
int[] dx = {0, -1, 0, 1};
int[] dy = {-1, 0, 1, 0};
Queue<Pair> queue = new LinkedList<>();
int[][] visited = new int[h][w];
visited[str.x][str.y] = 0;
queue.offer(new Pair(str.x, str.y));
while (!queue.isEmpty()) {
Pair now = queue.poll();
for (int i = 0; i < dx.length; i++) {
int tx = now.x + dx[i];
int ty = now.y + dy[i];
while (tx >= 0 && tx < h && ty >= 0 && ty < w && map[tx][ty] != '*') {
if (visited[tx][ty] == 0) {
visited[tx][ty] = visited[now.x][now.y] + 1;
queue.offer(new Pair(tx, ty));
}
tx += dx[i];
ty += dy[i];
}
}
}
System.out.println(visited[dest.x][dest.y] - 1);
}
static class Pair {
public int x;
public int y;
public Pair(int x, int y) {
this.x = x;
this.y = y;
}
}
}