나 개발자 진짜 되냐?

[ C++ ] 프로그래머스 - 노란불 신호등 ( lcm ) 본문

프로그래머스를 풀어보아요!/C++

[ C++ ] 프로그래머스 - 노란불 신호등 ( lcm )

Snow Rabbit 2026. 6. 30. 22:23

 

반갑습니다.

오랜만이군요.

코테 한번 떨어지고 사람이 휘청거리는군요.

저는 멘탈쓰가 많이 약한가 봅니다.

6월의 마지막을 장식하기 위해

정답률 30퍼짜리를 가져왔습니다.

 

쉬울 줄 알았는데? 어렵네요.

함께 보시죠

 


 

 

신호등이라...

 

원래 내 계획은

신호등의 색이 노란색일 때기 때문에

bool 값으로 노란색만 1로 표시해 두고 

신호등 다 1인곳을 찾으면.. 그곳을 return해주는.. 생각을 하고 있긴 했는데..

입출력 예제 3을 보니 190까지 가는 거 보면..

숫자의 범위를 어디까지 해줘야 할지 감이 잘 안 왔다.

 

그리고 노란색이 2 초일수도 5 초일수도 있어서..

배수로 되지도 않는다.

 

 

 

오랜 고민 끝에 인지 씨를 찾았다.

 

인지시는 굉장히 어렵게 설명했다.

 

그래서 내가 다시 정리했다.

 

 

자,

일단 한 사이클을 이해해야 한다.

232의 경우

한 바퀴 다 도는데 7이 걸린다.

즉 한바퀴 다 도는데 7이기 때문에

그다음은 8부터 시작이다.

 

초는 1초부터 시작하기 때문에

8초에 다시 초록이 시작하게 되고

그럼 10초에 다시 노랑이가 된다.

 

쉽게 다시 말하면

1부터 2 = 초록

3부터 5 = 노랑

5부터 7 = 빨강인데

 

10초 뒤에는

10 - 한 바퀴(7) = 3

이니 노랑 위치인 것이다.

 

그럼 20초 뒤에는?

20 - 두 바퀴 (14) = 7

빨강 위치인 것

 

24초 뒤는?

24 - 세 바퀴 (21) = 3

다시 노랑이 된다.

 

그래서!

초는 1초부터 시작이기 때문에 컴퓨터에 맞춰서

-1을 해줘야 한다.

(초 - 1) % 한 사이클 + 1

그리고 후에 +! 해줘야 한다.

 

% 한 사이클 해서 그 나머지로 색깔을 알 수 있다.

 

하나 알았고,

 

그렇다면 우리가 필요한 건

1. 각 신호등마다의 한 사이클 시간

2. 범위

 

를 알아야 한다.

뭐 언제까지 더할 건데? 이거다.

 

그러면

입출력 예 2를 보면

2 3 2 = 7

3 1 3 = 7

2 1 1 = 4

이다.

 

 

과거의 초등학교 때

철수랑 영희랑 뭐 한 명은 2분에 한번씩가고 한명은 3분에 한 명씩 가고

이러면 언제쯤 같이 만나냐 할 때

최소공배수를 구했던 거 같다.

 

이걸 반대로 생각해 보면,

 

 

7과 7 그리고 4의 최소공배수를 구해보자.

그러면

 

28이다.

그럼 for문으로 28 이상일 때까지도 없으면?

한 바퀴 돌아도 없는 거니까

-1을 출력하면 될 거 같다.

 

STL로 lcm이 존재한다.

gcd의 친구이다.

lcm도 마찬가지로 두 가지 식밖에 못 넣는다.

 

그래서 우리는 누적해서 계산해줘야 한다.

 

 

그래서 식을 정리하면

 

1. lcm을 구하기 위한 식 하나 준비한다.

 

그렇게 우리는 최댓값을 찾았다.

아! lcm의 값은 애초에 공식이 (a*b) / gcd(a, b) 이기 때문에

long long으로 해주는 게 정석이다!

 

 

2. 다음으로 초 - 1 % 사이클 + 1을 해준다.

 

다음 for문으로 1부터 끝까지 돌고

yellow의 bool값을 하나 준비해 준다.

 

그리고 아까 식을 동일하게 준비해 주고

pos로 어디 위치에 있는지 찾는다

범위는 아까 3부터 5 랬으니

 

노란색 시작 = 초록 다음 

노란색 끝 = 초록+ 노랑

 

을 해주고

1번 신호등의 범위가 노랑이 아니면 false 해준다.

그리고 이제 이 시간대는 볼 필요가 없어졌다. 왜냐면 셋다 같은 시간이 아니니까!

break를 해주면서, 다음 초로 넘어가게 된다.

 

셋 다 ture인 거면 같은 위치일 테니..

i값으로 지금 시간을 뱉는다.

 

그리고 맨 밑까지 return이 안 됐다면..

max를 넘긴 거일 테니 -1을 해주게 된다.

 

 

 

전체 답


 

 

양심이 없는 점수...

 

너무 어려웠는데.. 퉤

 

어려운.. 듯했는데

어렵다.

근데 뭔가 쉽다

이 설명할 수 없는데

어차피 답을 봤지만

뭔가 쉽다.

설명하긴 어렵다.

 

 

그렇다.

어렵다.

1점 준건 서운하다.

 

그래도 풀었(?)다.

괴물들이 푸는 문제였다.