Baekjoon/IM Level

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

hellosonic 2023. 3. 21. 18:31

문제요약

나의 코드 및 설명

  • 신호등 정보를 리스트에 저장하고, while문을 통해 시간과 이동거리가 1씩 증가할 때, 신호등을 만나게 되면 신호등 정보가 저장된 리스트를 통해 현재 빨간불인지, 파란불인지를 살펴본다.
n, l = map(int, input().split())
light = []

#신호등 정보를 리스트에 저장
for _ in range(n):
    light.append(list(map(int, input().split())))

#시간
time = 0
#이동한 거리
distance = 0
i = 0
while True:
    #시간이 1씩 경과
    time += 1
    #시간이 1씩 경과함에 따라 이동한 거리도 1씩 증가
    distance += 1
    #이동한 거리가 도로의 끝에 다다르면 반복문 탈출 
    if distance == l:
        break

    else: 
        #신호등이 저장된 리스트를 하나하나 살펴본다. i=0부터 시작
        if i < n:
            #이동한 거리에 신호등이 있다면
            if distance == light[i][0]:
                #시간을 빨간불+파란불 지속시간으로 나눈 것이 빨간불 지속시간보다 작거나 같으면,
                #아직 빨간불이라는 것, 즉 시간에 남은 빨간불 지속시간을 빼주면 된다.
                if time % (light[i][1] + light[i][2]) <= light[i][1]:
                    time += (light[i][1] - (time % (light[i][1] + light[i][2])))
                #만약 초록불인 상태라면 시간에 아무것도 더해주지 않는다.
                else:
                    time += 0
                #신호등을 살펴봤으므로 다음 신호등을 살펴보기 위해 i를 1 증가
                i += 1
print(time)

다른 코드 및 설명

  • 문제가 내 방식대로 잘 풀리지 않아 다른 사람의 코드를 잠깐 참고해봤다.
  • 신호등 정보를 입력받을 때 마다, 
    시간은 <신호등의 위치 - 현재 이동한 거리> 만큼 더해주고, 이동 거리는 신호등의 위치로 초기화 한다.
    그 후, 신호등이 빨간불인지를 살펴보고, 현재 빨간불이라면, 빨간불이 끝날 때 까지의 시간을 계산하여 시간에 추가로 더해준다. 
n, l = map(int, input().split())

time = 0
distance = 0
for _ in range(n):
    d, r, g = map(int, input().split())

    time += (d - distance)
    distance = d
    if time % (r+g) <= r:
        time += (r - (time % (r+g)))

time += (l - distance)
print(time)

피드백

열 두번은 넘게 풀어본 것 같다. 내가 처음부터 고집하던 방식인 while문을 통해 시간, 이동거리가 1씩 증가하면서 신호등을 만났을 때 빨간불인지 파란불인지 계산하는 방식을 통해 문제를 풀고 싶었는데, 뭐 때문이지 자꾸 틀렸다고 나왔다. 분명이 예제의 입력값은 다 맞게 출력되고, 다른 반례도 없어보이는데.. 

결국 몇 시간 뒤 처음부터 다시 풀어봤는데 맞았다. 아마도 신호등이 빨간불일때 빨간불이 남은 만큼을 더해줘야 되는데, 빨간불 지속시간의 범위를 잘못 살펴본게 아닐까 싶다.

다른 사람의 코드는 이해하는 정도로 넘어갔다. 아직 저렇게 짧게 구현할만큼의 실력은 안되는 것 같다.