[ 백준 ] 2980 / 도로와 신호등

金弘均·2021년 9월 15일
0

Baekjoon Online Judge

목록 보기
64/228
post-thumbnail

# Appreciation

/*
 * Problem :: 2980 / 도로와 신호등
 *
 * Kind :: Simulation
 *
 * Insight
 * - 신호등을 마주쳤을 때 빨간불이면
 *   초록불이 될 때까지 기다린다
 *   + 1 - 신호등을 마주칠 때까지 이동
 *     2 - 마주쳤을 때 초록불이면 그냥 지나감
 *         빨간불이면 초록불이 될 때까지 기다림
 *     도로의 끝까지 이동하면서 1,2 반복
 *
 * Point
 * - 상근이의 트럭이 도로에 진입했을 때,
 *   모든 신호등의 색상은 빨간색이고 사이클이 막 시작한 상태이다
 *   + R=1, G=2 이면
 *     시간 | 색깔
 *       0 | 빨
 *       1 | 초
 *       2 | 초
 *       3 | 빨
 *       4 | 초
 *       5 | 초
 *       ......
 *     # 주기는 (R+G)
 *       시간이 T 일 때,
 *       T % (R+G) 의 값이 R 보다 작으면 빨간불
 *       R 이상이면 초록불이다!
 */

# Code

//
//  BOJ
//  ver.C++
//
//  Created by GGlifer
//
//  Open Source

#include <iostream>

using namespace std;

#define endl '\n'

// Set up : Global Variables
/* None */

// Set up : Functions Declaration
/* None */


int main()
{
    // Set up : I/O
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    // Set up : Input
    int N, L;
    cin >> N >> L;
    int D[N], R[N], G[N];
    for (int i=0; i<N; i++)
        cin >> D[i] >> R[i] >> G[i];

    // Process
    int time = 0, cd = 0; /* 시간, 현재 이동한 거리 */
    for (int i=0; i<N; i++) {
        int d = D[i], r = R[i], g = G[i]; /* 마주친 신호등의 정보 */
        time += (d-cd); /* 신호등을 마주칠 때까지 이동한 시간 추가 */
        cd = d; /* 현재 이동한 거리 갱신 */
        int v = time % (r+g); /* 신호등 색깔 판단 */
        if (v < r) { /* 빨간불이면 */
            time += r-v; /* 초록불이 될때까지 대기 */
        } else continue; /* 초록불이면 그냥 지나감 */
    } time += (L-cd); /* 마지막 신호등으로부터 도로 끝까지 이동한 시간 추가 */

    // Control : Output
    cout << time << endl;
}

// Helper Functions
/* None */
profile
이런 미친 게임을 봤나! - 옥냥이

0개의 댓글