알고리즘 풀이/백준

[백준 2980] 도로와 신호등

mhko411 2021. 5. 12. 00:08
728x90

문제

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

상근이의 트럭이 도로에 진입했을 때, 모든 신호등의 색상은 빨간색이고, 사이클이 막 시작한 상태이다. 상근이는 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가 증가하는 순서로 주어지며, 같은 위치에 있는 신호등이 두 개 이상 있는 경우는 없다.

 

출력

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


접근

처음에는 문제에 있는대로 구현을 했지만 시간초과가 발생했다.

이후에 다른 사람들의 풀이를 참고하였다. 

현재시간과 빨간불, 초록불의 주기를 통해 구할 수 있었다. 즉, 현재 시간 % (빨간불 + 초록불)했을 때 빨간불의 시간보다 적다면 기다려야하고 기다리는 시간만큼 더해준다.

 

구현

- 신호등의 개수와 거리를 입력받아 N, L에 저장한다.

- 초기에 현재위치 pos와 경과 시간 answer을 0으로 초기화한다.

N, L = map(int, input().split())
pos = 0
answer = 0

 

- N개의 신호를 입력받을 때마다 다음과 같은 계산을 반복한다.

- 경과 시간에 (신호등 위치 - 현재위치)만큼 더해준다.

- 현재위치를 d로 갱신한다.

- 이후 빨간불과 초록불의 시간을 더하고 이를 경과시간에 나눈 나머지가 빨간불 이하라면 대기해야한다.

- 따라서 대기하는 시간만큼 경과시간에 더한다.

for _ in range(N):
    d, r, g = map(int, input().split())

    answer += (d - pos)
    pos = d
    if answer % (r+g) <= r:
        answer += (r - (answer%(r+g)))

 

- N개의 신호를 입력받은 후에

- 마지막 신호등과 L과의 거리를 경과 시간에 더하고 출력한다.

answer += (L-pos)
print(answer)

전체 코드

import sys
input = sys.stdin.readline

N, L = map(int, input().split())
pos = 0
answer = 0

for _ in range(N):
    d, r, g = map(int, input().split())

    answer += (d - pos)
    pos = d
    if answer % (r+g) <= r:
        answer += (r - (answer%(r+g)))

answer += (L-pos)
print(answer)