Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
Tags
- 게임 개발
- 게임용어
- til
- 유니티
- 게임 회사
- 트러블슈팅
- 내일배움캠프
- 코딩
- ag 내일배움캠프
- 프로그래밍
- 코테
- 원신
- 붕괴 스타레일
- 나만의 견해
- 셰이더
- LookAt
- 붕괴스타레일
- spritemask2d
- 스파르타내일배움캠프
- 블렌더
- 공부
- 연습
- 게임분석
- spritelibrary
- 게임
- 스파르타내일배움캠프TIL
- 뭐드라
- materialpropertyblock
- 취미
- 까먹기전에메모
Archives
- Today
- Total
덴바의 노트
[코딩테스트 : 프로그래머스] 노란불 신호등 C# 본문
문제 내용

문제 분석
여러 신호등이 노란색이 되어 정전이 일어나는 시간을 찾기
1. LCM을 활용해서 신호등 전체의 한 사이클 범위를 분석.
2. 나머지 계산(%)을 통해서 노란색이 사이클 내에 몇 번인지 파악하고, 이를 활용해서 노란색이 겹치는 타이밍을 계산
필요한 알고리즘 - LCM, GCD
// 유클리드 호제법 최대 공약수
private int GCD(int a, int b)
{
while(b != 0)
{
int temp = a % b;
a = b;
b = temp;
}
return a;
}
private int LCM(int a, int b)
{
return a / GCD(a, b) * b;
}
public class Solution
{
public int solution(int[,] signals)
{
int row = signals.GetLength(0);
int lcm = 1;
for(int i = 0; i < row; i++)
{
int cycle = signals[i, 0] + signals[i, 1] + signals[i, 2];
lcm = LCM(cycle, lcm); // 신호등 전체의 한 사이클을 최소 공배수로 계산
}
for(int t = 1; t <= lcm; t++)
{
bool isAllYellow = true;
for(int i = 0; i < row; i++)
{
int green = signals[i, 0];
int yellow = signals[i, 1];
int red = signals[i, 2];
int yellowStart = green + 1;
int yellowEnd = green + yellow;
int cycle = green + yellow + red;
int pos = t % cycle; // 각 신호등의 사이클 내에서 몇 번째인지 추출
if(pos == 0) // 한 사이클을 다 돌음
pos = cycle;
if(pos < yellowStart || pos > yellowEnd) // 노란색 범위 밖일 경우
{
isAllYellow = false;
break;
}
}
if(isAllYellow) return t; // 정전 시간 반환
}
return -1; // 해당하지 않는 경우
}
}