Programming/백준

[실버 4] 백준 2980 - 도로와 신호등 (파이썬)

pental 2025. 4. 25. 17:19

https://www.acmicpc.net/problem/2980

풀이

  • 길이 L인 도로 위에 N개의 신호등이 있음
  • 각 신호등은 D(거리), R(빨간불 지속 시간), G(초록불 지속 시간)의 정보를 가짐
  • 차량은 초당 1m 이동
  • 빨간불이면 정지, 초록불이면 통과
  • 도로의 끝까지 도달하는 데 걸리는 시간 출력

사실 이부분에서 계속 오류가 나서 봤더니 “)” 위치가 왜 뒤로 가 있던건지,, 하,,

N, L = map(int, input().split())
info = [list(map(int, input().split())) for _ in range(N)]

N, L, info는 각각 신호등의 개수, 도로 길이, 각 신호등의 위치 D, 빨간불 R, 초록불 G를 저장한다.

state = ['R'] * N
remain = [info[i][1] for i in range(N)]

state는 각 신호등의 현재 상태를 나타내고, 처음은 모두 빨간불로 시작한다.

remain의 경우 해당 신호등의 남은 시간을 나타낸다.

pos = 0
for i in range(100000):
    if pos == L:
        print(i)
        break

차량의 위치 pos가 L에 도달하면 종료하고 걸린 시간 i를 출력한다.

stop = False
for j in range(N):
    if info[j][0] == pos:
        if state[j] == 'R':
            stop = True
            break

현재 위치에 신호등이 있다면, 그 신호등이 빨간불이면 stop = True로 설정한다.

if not stop:
    pos += 1

빨간불이 아니면 1m 전진한다.

for j in range(N):
    remain[j] -= 1
    if remain[j] == 0:
        remain[j] = info[j][1] if state[j] == 'G' else info[j][2]
        state[j] = 'R' if state[j] == 'G' else 'G'

모든 신호등의 remain이 감소하고, 신호등 주기가 끝나면 상태를 전환하고 새로운 지속 시간으로 초기화 한다.

코드

# 백준 2980 - 도로와 신호등
# 분류 : 구현

N, L = map(int, input().split())
info = [list(map(int, input().split())) for _ in range(N)]
state = ['R'] * N
remain = [info[i][1] for i in range(N)]

pos = 0
for i in range(100000) :
    if pos == L :
        print(i)
        break
    
    stop = False
    for j in range(N) :
        if info[j][0] == pos :
            if state[j] == 'R' :
                stop = True
                break
    
    if not stop :
        pos += 1
    
    for j in range(N) :
        remain[j] -= 1

        if remain[j] == 0 :
            remain[j] = info[j][1] if state[j] == 'G' else info[j][2]
            state[j] = 'R' if state[j] == 'G' else 'G'