BOJ 2980

2020-06-07

위 문제는 백준 사이트의 알고리즘 2980 문제에 관한 설명입니다.


문제

상근이는 트럭을 가지고 긴 일직선 도로를 운전하고 있다.

도로에는 신호등이 설치되어 있다.

상근이는 각 신호등에 대해서 빨간 불이 지속되는 시간과 초록 불이 지속되는 시간을 미리 구해왔다. (빨강색과 초록색 불빛은 무한히 반복된다)

상근이의 트럭이 도로에 진입했을 때, 모든 신호등의 색상은 빨간색이고, 사이클이 막 시작한 상태이다.

상근이는 1초에 1미터를 움직인다. 신호등의 색상이 빨간색인 경우에는 그 자리에서 멈추고 초록색으로 바뀔때 까지 기다린다.

상근이가 도로의 끝까지 이동하는데 걸리는 시간을 구하는 프로그램을 작성하시오. 도로의 시작은 0미터이고, 끝은 L미터인 지점이다.

입력

첫째 줄에 신호등의 개수 N과 도로의 길이 L이 주어진다. (1 ≤ N ≤ 100, 1 ≤ L ≤ 1000)

다음 N개 줄에는 각 신호등의 정보 D, R, G가 주어진다. (1 ≤ D < L, 1 ≤ R ≤ 100, 1 ≤ G ≤ 100) D는 신호등의 위치이며, R과 G는 빨간색, 초록색이 지속되는 시간이다.

신호등은 D가 증가하는 순서로 주어지며, 같은 위치에 있는 신호등이 두 개 이상 있는 경우는 없다.

출력

첫째 줄에 상근이가 도로의 끝까지 이동하는데 걸리는 시간을 출력한다.


import java.awt.Point;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;

class RoadLight {
    static int N, L;
    static ArrayList<Point> arrList = new ArrayList<>();
    static ArrayList<Point> tempList = new ArrayList<>();

    public static void main(String[] args)throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        N = Integer.parseInt(st.nextToken());
        L = Integer.parseInt(st.nextToken());

        for (int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine());
            int w = Integer.parseInt(st.nextToken());
            int r = Integer.parseInt(st.nextToken());
            int g = Integer.parseInt(st.nextToken());
            arrList.add(new Point(w, r, g));
            tempList.add(new Point(w, r, g));
        }

        int time = 0;
        int length = 0;
        int index = 0;
        while (length < L && index < N) {
            int next = arrList.get(index).where;
            int temp = length;
            for (int current = temp + 1; current <= next; current++) {
                for (int l = 0; l < arrList.size(); l++) {
                    if (arrList.get(l).isRed) {
                        if (arrList.get(l).red == 1) {
                            arrList.get(l).red = tempList.get(l).red;
                            arrList.get(l).isRed = false;
                        } else {
                            arrList.get(l).red--;
                        }
                    } else {
                        if (arrList.get(l).green == 1) {
                            arrList.get(l).green = tempList.get(l).green;
                            arrList.get(l).isRed = true;
                        } else {
                            arrList.get(l).green--;
                        }
                    }
                }
            }
            if (arrList.get(index).isRed) {
                int value = next - length;
                length += value;
                time += value;
                time += arrList.get(index).red;
                int iter = arrList.get(index).red;

                for (int i = 0; i < iter; i++) {
                    for (int j = 0; j < arrList.size(); j++) {
                        if (arrList.get(j).isRed) {
                            if (arrList.get(j).red == 1) {
                                arrList.get(j).red = tempList.get(j).red;
                                arrList.get(j).isRed = false;
                            } else {
                                arrList.get(j).red--;
                            }
                        } else {
                            if (arrList.get(j).green == 1) {
                                arrList.get(j).green = tempList.get(j).green;
                                arrList.get(j).isRed = true;
                            } else {
                                arrList.get(j).green--;
                            }
                        }
                    }
                }
            } else {
                int value = next - length;
                length += value;
                time += value;
            }
            index++;
        }
        time += (L - length);
        System.out.println(time);
    }

    public static class Point {
        int where;
        int red;
        int green;
        boolean isRed = true;

        public Point(int where, int red, int green) {
            this.where = where;
            this.red = red;
            this.green = green;
        }
    }
}

짜다가.. 도저히 안돼서.. 다른분꺼 보고 참고함..

공부 더 해야할 듯 합니다.

도로와 신호등