• 백준 2980번 도로와 신호등 :: 마이구미
    알고리즘 풀이/수학 2017. 12. 17. 12:59
    반응형

    이 글은 백준 알고리즘 문제 2890번 "도로와 신호등" 을 풀이한다.

    시뮬레이션 문제로써, 시나리오를 정확히 이해한 후 그대로 구현하면 된다.

    문제 링크 - https://www.acmicpc.net/problem/2980


    상근이는 트럭을 가지고 긴 일직선 도로를 운전하고 있다. 도로에는 신호등이 설치되어 있다. 상근이는 각 신호등에 대해서 빨간 불이 지속되는 시간과 초록 불이 지속되는 시간을 미리 구해왔다. (빨강색과 초록색 불빛은 무한히 반복된다)

    상근이의 트럭이 도로에 진입했을 때, 모든 신호등의 색상은 빨간색이고, 사이클이 막 시작한 상태이다. 상근이는 1초에 1미터를 움직인다. 신호등의 색상이 빨간색인 경우에는 그 자리에서 멈추고 초록색으로 바뀔때 까지 기다린다.

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


    본인의 경우에는 주어지는 각 신호등은 흐르는 시간에 비례한다고 가정하고 접근했다.

    각 신호등을 0미터에서 출발했을 때, 지속시간을 통해 어떤 색인지를 판단했다.


    // j = 시간 while (j <= d + g) { for (int k = 0; k < r; k++) { temp[j++] = 0; } for (int k = 0; k < g; k++) { temp[j++] = 1; } }


    하지만 빨간불로 인해 대기시간에 따라 다음에 위치하는 신호등에 영향을 미친다는 것이다. 

    이것이 의미하는 것은, 각 신호등은 흐르는 시간에 비례하지 않는다는 것이다.

    이전 신호등에서 빨간불로 인해 대기하는 시간을 고려해야한다는 것이다.


    예를 들면, 다음과 같이 주어졌을 경우를 보자.


    2 10

    3 5 5

    5 2 2


    위치가 3인 신호등은 빨간불이 5초간 지속된다.

    이것이 의미하는 것은 2초의 대기시간이 존재한다.

    다음 신호등은 2초의 대기시간을 고려해야한다.

    결론적으로 도달하는 것은 각 신호등에 도착하는 시간을 구하는 것이다.


    신호등에 도착한 시간 % ( 빨간불 + 초록불 ) 의 값이 빨간불보다 작거나 같으면 빨간불, 크다면 초록불이라는 것을 알 수 있다.

    이 값을 이용하면 각 신호등에 도착하는 시간을 구할 수 있다.


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    private void solve() {
        int n = sc.nextInt();
        int l = sc.nextInt();
        int t = 0;
        int pre = 0;
     
        for (int i = 0; i < n; i++) {
            int d = sc.nextInt();
            int r = sc.nextInt();
            int g = sc.nextInt();
     
            // t - 위치 d에 있는 신호등까지 걸린 시간
            t += d - pre;
            pre = d;
     
            int red = t % (r + g);
            if (red <= r) {
                // 빨간 불이 끝날때까지 대기
                t += r - red;
            }
        }
        System.out.println(t + (l - pre));
    }
    cs


    반응형

    댓글

Designed by Tistory.