본문 바로가기

OJ

[BOJ] 16930 달리기 (JAVA)

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