[백준] 2980번 도로와 신호등 . python

sun1·2023년 3월 3일
0

im_test

목록 보기
7/22
post-thumbnail

문제

' 2980번 도로와 신호등 '
https://www.acmicpc.net/problem/2980

풀이

조건

  • 도로의 시작은 0미터이고, 끝은 L미터인 지점이다.
  • D는 증가하는 순서로 주어지며, 같은 위치에 있는 신호등이 두 개 이상 있는 경우는 없다.

풀이 순서

  • 신호등의 개수 N과 도로의 길이 L, 각 신호등의 정보 D, R, G (D는 신호등의 위치이며, R과 G는 빨간색, 초록색이 지속되는 시간) 입력값을 받는다.
  • 끝까지 이동하는 거리를 저장할 변수를 지정하고 신호등이 있는 지점에서 기다려야 되는지 판단한다.
  • 거리에 따른 시간과 빨간불에서 지체되는 시간까지의 합을 총 더해서 시간을 구한다.

Check point

  • 초록불이 켜져있거나 초록불이 시작하는 시작 지점에는 그대로 통과하기 때문에 지점까지 이동한 거리가 바로 걸리는 시간이다.
  • 빨간불이 켜져있는 경우는 빨간불이 켜져 있는 시간에 신호등 있는 지점에 도착한 경우이다.

코드

Python

N, L = map(int, input().split())
arr = [list(map(int, input().split())) for _ in range(N)]
total = 0
pre = 0
# 초록불이 시작되는 시간에 total값이 같거나 초록불이 켜져있는 동안은 지체 시간이 없음 (간 거리만큰 시간 걸림)
for i in range(N):
    total += (arr[i][0] - pre)  # 현재점에서 그전까지 거리
    pre = arr[i][0]  # 그 전에 간 거리
    if (total % (arr[i][1] + arr[i][2])) <= arr[i][1] :  # 빨간불이 켜져있는데 도착한 경우 
        x = (total % (arr[i][1] + arr[i][2])) - arr[i][1]  # 기다려야 하는 시간 (음수)
        total += abs(x)

total += L - arr[-1][0]  # 마지막 남은 값 더해주기 -> 신호등 없으니 거리만큼 시간 걸림
print(total)

다른 방법

N, L = map(int, input().split())
road = [0] * (L + 1)
for _ in range(N):
    D, R, G = map(int, input().split())
    road[D] = [R, G]

# 현재 시간, 현재 자동차 위치 변수 지정
time = 0
pos = 0
# 자동차가 L위치에 도달할 때까지 반복
while pos < L:
    # 자동차가 움직이는 경우
    # 현재 위치가 신호등이 없을 때
    if road[pos] == 0:
        # time += 1
        pos += 1

    # 있을 때
    else:
        R, G = road[pos]
        # 현재 시간엥서 신호등이 빨간불 일 때
        if (time % (R + G)) < R:  # time % 한사이클 < 빨간불 지속시간
            # time += 1
            pass
        else:
            # time += 1
            pos += 1
    time += 1

print(time)

0개의 댓글