https://www.acmicpc.net/problem/16930
16930번: 달리기
진영이는 다이어트를 위해 N×M 크기의 체육관을 달리려고 한다. 체육관은 1×1 크기의 칸으로 나누어져 있고, 칸은 빈 칸 또는 벽이다. x행 y열에 있는 칸은 (x, y)로 나타낸다. 매 초마다 진영이는
www.acmicpc.net
처음 풀어본 플래티넘3 문제인데, 97%에서 시간초과 나는게 너무 스트레스였습니다.
같은 index에서의 중복 검사를 제거하는 것이 핵심입니다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws Exception {
int[] dr = { -1, 0, 1, 0 };
int[] dc = { 0, 1, 0, -1 };
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(st.nextToken());
char[][] map = new char[N][M];
int[][] visited = new int[N][M];
for (int i = 0; i < N;i++) {
map[i] = br.readLine().toCharArray();
}
st = new StringTokenizer(br.readLine(), " ");
int sr = Integer.parseInt(st.nextToken()) - 1;
int sc = Integer.parseInt(st.nextToken()) - 1;
int er = Integer.parseInt(st.nextToken()) - 1;
int ec = Integer.parseInt(st.nextToken()) - 1;
// end of input
Queue<int[]> q = new LinkedList<>();
q.offer(new int[] { sr, sc });
visited[sr][sc] = 1;
while (!q.isEmpty()) {
int[] now = q.poll();
if (now[0] == er && now[1] == ec) {
System.out.print(visited[now[0]][now[1]] - 1);
return;
}
for (int dir = 0; dir < 4; dir++) {
int nr = now[0] + dr[dir];
int nc = now[1] + dc[dir];
int len = 0;
while (++len <= K && 0 <= nr && nr < N && 0 <= nc && nc < M && map[nr][nc] == '.') {
if (visited[nr][nc] == 0) {
q.offer(new int[] { nr, nc });
visited[nr][nc] = visited[now[0]][now[1]] + 1;
} else if(visited[nr][nc] <= visited[now[0]][now[1]]) break;
nr += dr[dir];
nc += dc[dir];
}
}
}
System.out.print(-1);
}
}
'OJ' 카테고리의 다른 글
[BOJ] 6549 히스토그램에서 가장 큰 직사각형 (JAVA) (0) | 2023.01.10 |
---|---|
[BOJ] 4153 직각삼각형 (JAVA) (0) | 2023.01.09 |
[BOJ] 5427 불 (JAVA) (0) | 2023.01.07 |
[BOJ] 11967 불켜기 (JAVA) (2) | 2023.01.06 |
[BOJ] 16918 봄버맨 (JAVA) (0) | 2023.01.05 |