1. 문제 설명
https://school.programmers.co.kr/learn/courses/30/lessons/468371

2. 제한 사항


3. 입출력 예



4. 풀이
import math
def solution(signals):
answer = 1
s_list = [[] for _ in signals]
for index, s in enumerate(signals):
for i in range(3):
s_list[index].extend([True if i == 1 else False for _ in range(s[i])])
s_sum = [sum(s) for s in signals]
limit = s_sum[0]
for ss in s_sum[1:]:
limit = get_lcm(limit, ss)
while answer <= limit:
result = True
for s in s_list:
result &= s[answer % len(s)]
if result:
return answer + 1
else:
answer += 1
return -1
def get_lcm(a, b):
return (a * b) // math.gcd(a, b)
5. 후기
신호등 주기를 보면 모두 같지 않고 같은 경우도 있고 다른 경우도 있다. 사실 언제 노란색으로 만나는지 구하는 건 신호등 초를 1초 단위로 바꿔서 1초마다 검사하도록해서 쉽게 구현했는데 문제는 노란색이 겹치지 않는 경우를 구하는 거였다. 처음에는 주기가 같은 것들끼리 딕셔너리로 모아서 서로 다른 노란색 구간이 있으면 절대로 만날 일 없으니 이거를 구하려고 했으나... 너무 복잡해지는 느낌이 들어서 더 생각해 보니 그냥 중간에 1초씩 검사할 때 반복을 최소공배수만큼 돌리면 되는 거였다. 어차피 그 이후는 똑같을 테니까.
'코딩테스트 (프로그래머스) > Python' 카테고리의 다른 글
| [프로그래머스][Python][Lv. 2] 바이러스 파이프 (0) | 2026.07.10 |
|---|---|
| [프로그래머스][Python][Lv. 1] 중요한 단어를 스포 방지 (0) | 2026.06.07 |
| [프로그래머스][Python][Lv. 1] 3진법 뒤집기 (0) | 2026.05.23 |
| [프로그래머스][Python][Lv. 2] 올바른 괄호 (0) | 2026.05.10 |
| [프로그래머스][Python][Lv. 2] 방문 길이 (0) | 2026.05.03 |