"꾸준하고 완벽한 한 걸음"

PS/Baekjoon Online Judge

[백준 27376] 참살이길 [Java]

kimyoungrok 2025. 4. 15. 10:45
728x90

문제

https://www.acmicpc.net/problem/27376

 


풀이

구현 시뮬레이션에 시간도 계산해야 하는 문제라 난이도에 비해 까다로웠다.

0에서 N까지 1씩 이동해야 하며, k개의 신호등이 초록불일 때만 이동하는 문제다.

신호등의 위치가 순서대로 주어지는 보장이 없으니 입력받은 신호등 정보를 좌표 기준으로 오름차순 정렬하자.

        List<int[]> list = new ArrayList<>();
        for (int i = 0; i < K; ++i) {
            input = br.readLine().split(" ");
            final int x = Integer.parseInt(input[0]);
            final int t = Integer.parseInt(input[1]);
            final int s = Integer.parseInt(input[2]);
            list.add(new int[]{x, t, s});
        }
        list.sort(Comparator.comparingInt(a -> a[0]));

정렬된 신호등까지는 1씩 이동한다. 마지막 위치에서 신호등 위치까지의 거리를 이용해 한 번에 계산하자.

        long time = 0, lastPos = 0;
        for (int[] info : list) {
            final int x = info[0];
            final int t = info[1];
            final int s = info[2];
            time += x - lastPos;

만약 신호등의 첫 초록불 시간(s) 이전에 도착했다면 시간차 만큼 기달렸다가 이동하자

            if (s > time) {
                time += s - time;
            }

초록불 시간 이후에 도착했다면 신호등이 다시 초록불이 될 때 까지 기다려야 한다.

현재 시간에서 첫 초록불 시간을 뺀 시간차를 신호등 불 간격(t)로 나눈 몫이 2의 배수인지 확인하자.

            else {
                final long diff = time - s;
                final boolean enableRed = (diff / t) % 2 == 1;

만약 2의 배수가 아니라면 현재는 빨간불이므로 다음 초록불까지 대기해야 한다.

                time += enableRed ? t - diff % t : 0;
            }

신호등에 대해서만 시간을 계산하고, N까지 도착하는 시간에 대해서는 계산하지 않았기 때문에

마지막 신호등에서 N까지의 거리만큼 시간을 더해야 한다.

            lastPos = x;
        }
        time += N - lastPos;

풀이시간

≤ 20m


소스코드

https://github.com/rogi-rogi/problem-solving/blob/main/baekjoon-online-judge/easy/27376.java

 

problem-solving/baekjoon-online-judge/easy/27376.java at main · rogi-rogi/problem-solving

Daily Problem Solving Challenges. Contribute to rogi-rogi/problem-solving development by creating an account on GitHub.

github.com

 

728x90