| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 | 31 |
- unity게임
- 유니티게임만들기
- c#코딩기초트레이닝
- 백준 구현문제
- Unity
- 바킹독
- 백준코테
- 유니티
- 오블완
- c#기본문법
- c++ 백준
- 바킹독알고리즘
- unity3dservival
- 리그오브레전드턴제게임
- 백준 C++
- c#
- c#코테
- 유니티공부
- 백준
- c#기초문법
- c++ solved.ac
- C++
- 백준 c++ 공부
- C#문법
- 티스토리챌린지
- 유니티서바이벌게임만들기
- unity3d게임만들기
- unity게임만들기
- solved class 2
- 백준코딩테스트
- Today
- Total
나 개발자 진짜 되냐?
[ C++ ] 프로그래머스 - 노란불 신호등 ( lcm ) 본문

반갑습니다.
오랜만이군요.
코테 한번 떨어지고 사람이 휘청거리는군요.
저는 멘탈쓰가 많이 약한가 봅니다.
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점 준건 서운하다.
그래도 풀었(?)다.
괴물들이 푸는 문제였다.
'프로그래머스를 풀어보아요! > C++' 카테고리의 다른 글
| [ C++ ] 프로그래머스 - 삼총사 ( 3중포문, 투포인터 ) (0) | 2026.07.01 |
|---|---|
| [ C++ ] 프로그래머스 - 중요한 단어를 스포 방지 ( set, substr, find ) (0) | 2026.06.19 |
| 코딩테스트 입문 - 안전지대 ( 2차원 배열 탐색 ) (0) | 2026.05.29 |
| 코딩테스트 연습 - 기능 개발 ( ceil , 나눗셈 ) (1) | 2026.05.28 |
| 코딩테스트 입문 - 저주의 숫자 3 ( 숫자 쪼개기 ) (0) | 2026.05.27 |