Notice
Link
rose_brown
[프로그래머스] 노란불 신호등 본문
1. 문제
https://school.programmers.co.kr/learn/courses/30/lessons/468371
2. 코드
python 1
import math
def is_yellow(signal, offest):
g, y, r = signal
if g + 1 <= offest <= g + y:
return True
else:
return False
def solution(signals):
# signals 별로의 사이클
cycles = [sum(signal) for signal in signals]
limit = math.lcm(*cycles)
for t in range(limit):
success = True
for cycle, signal in zip(cycles, signals):
offset = t % cycle
if not is_yellow(signal, offset):
success = False
if success:
return t
return -1
풀이
- 각 신호등의 **green + yellow + red**를 더해 신호등별 순환 주기 계산
- 모든 신호등의 상태가 다시 반복되는 시점을 구하기 위해 순환 주기의 최소 공배수(LCM)를 **limit**으로 설정
- **0 ~ limit**까지 모든 시간을 확인
- 현재 시간을 각 신호등의 순환 주기로 나눈 나머지를 이용해 현재 신호등의 위치 계산
- 모든 신호등이 노란불 구간이면 해당 시간 반환
- 끝까지 없으면 -1 반환
python 2
import math
def is_yellow(signal, offset):
green, yellow, red = signal
return green < offset <= green + yellow
def solution(signals):
cycles = [sum(signal) for signal in signals]
total_cycle = math.lcm(*cycles)
for time in range(1, total_cycle + 1):
all_yellow = True
for cycle, signal in zip(cycles, signals):
offset = (time - 1) % cycle + 1
if not is_yellow(signal, offset):
all_yellow = False
break
if all_yellow:
return time
return -1
3. 메모
- LCM + 완전 탐색을 통한 구현 문제
- 시간 복잡도 : O(L ×N)
- L : 각 신호등 순환 주기의 최소 공배수
- N : 신호등 개수
- 길이의 제한있어서 최악의 경우 20⁵ → 제한 시간 내에 전체 주기를 완전 탐색이 가능
- 해당 시간이 노란불인지를 확인해야 함
- time % cycle로 확인 가능
- python 1에서는 offset은 0 ~ cycle-1의 범위, 노란불 범위 1기준 → python 2에서는 주기를 맞추기 위해 offset을 1 ~ cycle-1 기준으로 변경
'코딩 > 프로그래머스' 카테고리의 다른 글
| [프로그래머스] 중요한 단어를 스포 방지 (0) | 2026.07.25 |
|---|---|
| [프로그래머스][PCCP 기출] 수레 움직임 (0) | 2026.05.01 |
| [프로그래머스][SQL] 자동차 대여 기록 별 대여 금액 구하기 (0) | 2026.04.30 |
| [프로그래머스][SQL] FrontEnd 개발자 찾기 (0) | 2026.04.30 |
| [프로그래머스][PCCP 기출] 수식 복원하기 (0) | 2026.04.30 |