https://www.acmicpc.net/problem/2980
2980번: 도로와 신호등
상근이는 트럭을 가지고 긴 일직선 도로를 운전하고 있다. 도로에는 신호등이 설치되어 있다. 상근이는 각 신호등에 대해서 빨간 불이 지속되는 시간과 초록 불이 지속되는 시간을 미리 구해왔
www.acmicpc.net
풀이
제일 먼저 시간을 리턴하는 함수를 어떻게 구현할지를 생각해보았습니다.
예제 2를 보며 설명하겠습니다.
도로는 사진과 같습니다.
현재까지 누적된 시간을 변수 time에 저장한다고 하고, R과 G는 문제에서 주어진 빨간불 지속시간, 초록불 지속시간 이라고 합시다.
1) 0에서 7까지 가는데에 7초가 걸릴 것입니다. (time = 7)
그리고 7에서 R - time = 6 이고, 6 - G = 1 이므로 빨간불에서 (R - 1)초간 대기를 합니다. (time = 7 + 6 = 13)
2) 7에서 14까지 가는데에 7초가 걸립니다. (time =13 + 7 = 20)
14에서 time - R - G - R = 2 이므로 초록불이고, 그냥 통과합니다. (time = 20 + 0 = 20)
3) 14에서 15까지 가는데에 1초가 걸립니다. (time = 20 + 1 = 21)
15에서 time - R - G - R = 5 이므로 초록불이고, 그냥 통과합니다. (time = 21 + 0)
4) 15에서 25까지 가는데에 10초가 걸립니다. (time = 21 + 10 = 31)
25에서 time - R - G - R - G ... - R = 0 이므로 초록불이고, 그냥 통과합니다. (time = 31 + 0 = 31)
5) 25에서 30까지 가는데에 5초가 걸립니다. (time = 31 + 5 = 36)
따라서 출력은 36이 됩니다.
함수에 구현할 내용을 구상해봅시다. 함수에는 시간만 리턴해줄 예정입니다.
위에 계산 한 내용들의 각 두번째 줄을 구현하겠습니다.
누적된 time에 R과 G를 순서대로 빼면서 결과가 양수가 되었을 때에 마지막 뺀 수가 R에 해당하는 숫자라면 초록불, G에 해당하는 숫자라면 빨간불로 판정합니다.
그래서 생각한 방법은 time에 R과 G를 더한 값을 나눈 나머지를 통하여 마지막 숫자가 R인지 G인지 알아내는 것입니다.
time % (R+G) 를 하게 된다면, R+G보다 작은 값이 나올것입니다. 만약 이 수를 R과 빼어 양수 혹은 0이 나온다면 마지막 뺀 값이 R이라는 말이므로 초록불이 되고, 음수라면 마지막 뺀 값이 G라는 말이 됩니다.
def time_cal(R, G, time):
if time % (R+G) - R >= 0:
return time
else:
time -= time % (R+G) - R
return time
위에 있는 말을 구현한 함수입니다.
신호등 위치인 D는 메인함수에서 time에 누적으로 더하는 것으로 구현했습니다.
import sys
def time_cal(R, G, time):
if time % (R+G) - R >= 0:
return time
else:
time -= time % (R+G) - R
return time
N, L = map(int, sys.stdin.readline().rstrip().split())
traffic_info = []
for _ in range(N):
traffic_info.append(sys.stdin.readline().rstrip().split())
time = 0
for i in range(N):
D = int(traffic_info[i][0])
R = int(traffic_info[i][1])
G = int(traffic_info[i][2])
if i == 0:
time += D
else:
time += D - int(traffic_info[i-1][0])
time = time_cal(R, G, time)
time += (L - D)
print(time)
후기
입력을 어떻게 해야 잘했다고 소문이 날까.. 하면서 입력 생각하는데에 시간을 너무 많이 쏟은 것 같습니다. 결국에는 딱히 방법이 생각나지 않아서 이중 리스트로 D, R, G를 입력받고, for문으로 순차적으로 접근했습니다. 이중 for문은 쓰기 싫어서 D, R, G를 인덱스 값으로 찾아갔습니다.
완전 수학 문제라는 기분이 들어 문제 푸는 과정이 재미있었습니다. 그림도 그리고 예제 코드도 계산해가는 과정이 재미있네요. 오늘 처음으로 시간을 재보면서 할까 하면서 13시 29분부터 풀었습니다. 딴짓도 해서 1시간정도 걸린것 같습니다.
'코딩테스트' 카테고리의 다른 글
[Python] 백준 3085번 - '사탕 게임' 풀이 (1) | 2023.01.17 |
---|---|
[Python] 백준 10546번 - '배부른 마라토너' 풀이 + 해시(hash) (1) | 2023.01.17 |
[Python] 백준 1780번 - '종이의 개수' 풀이 (1) | 2023.01.15 |
[C] 백준 10250번 - 'ACM 호텔' 풀이 (0) | 2023.01.14 |
[C] 백준 2884번 - '알람 시계' 풀이 (0) | 2023.01.14 |