BOJ_2980_도로와신호등_JAVA
문제 : 도로와 신호등
링크 : BOJ_2980_도로와신호등
접근 방식
1초에 1미터를 움직이는 트럭이 신호등을 만났을 때, 신호등의 상태에 따라서 전진할 지 멈출지 결정하여 최종 목적지까지 도착했을 때 흐른 시간을 출력하면 되는 문제이다.
풀이 방법
나는 이 문제를 푸는 방법으로 신호등 객체를 생성하여 이용했다. 신호등 객체의 각각의 타이머를 돌려 스스로의 신호 상태를 바꾸게 하고, 트럭이 해당 위치에 도착했을 때, 객체의 신호 상태를 읽어들여 빨간불이면 멈추고, 초록불이면 이동하게 하였다.
신호등 객체는 자신의 위치정보, 빨간불의 지속시간, 초록불의 지속시간, 타이머, 현재 자신의 상태(빨간불,초록불)를 멤버변수로 갖는다.
신호등에 대한 정보를 입력받아, 신호등 객체 배열로 저장하고, 저장된 모든 신호등의 타이머를 1씩 증가시킨다.
각각의 빨간불, 초록불에 지속시간에 따라서 각 신호등 객체는 스스로의 상태를 변경시킨다. 나머지연산을 이용해서 변하는 시점을 구했다.
신호등 객체의 상태가 정해지면, 트럭을 1 증가시켜 이동시킨다.
이동시킨 후, 신호등을 순회하여 트럭과 같은 위치에 신호등이 있는지 확인한다. 만약 신호등이 있다면 빨간불일 경우 이동한 거리에서 -1을, 초록불이라면 그대로 둔다.
트럭이 1부터 시작하여 L에 도달했을 때, 반복을 종료하고 이때까지 걸린 시간을 출력한다.
소스 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class BOJ_2980_도로와신호등 {
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(in.readLine()," ");
int N = Integer.parseInt(st.nextToken());
int L = Integer.parseInt(st.nextToken());
TrafficLight[] traf = new TrafficLight[N];
for(int i=0;i<N;i++) {
st = new StringTokenizer(in.readLine()," ");
int dic = Integer.parseInt(st.nextToken());
int red = Integer.parseInt(st.nextToken());
int green = Integer.parseInt(st.nextToken());
traf[i] = new TrafficLight(dic, red, green);
}
int time = 0;
for(int i=1;i<L;i++) {
for(int j=0;j<N;j++) {
if(traf[j].timer % traf[j].red == 0 && traf[j].traffic == false) {
traf[j].timer = 0;
traf[j].traffic = true;
}else if(traf[j].timer % traf[j].green == 0 && traf[j].traffic==true) {
traf[j].timer = 0;
traf[j].traffic = false;
}
traf[j].timer++;
// System.out.print(traf[j].traffic + " ");
}
// System.out.println();
for(int j=0;j<N;j++) {
if(i == traf[j].dic && traf[j].traffic == false) {
i--;
}
}
time++;
}
System.out.println(time);
}
}
class TrafficLight{
int dic;
int red;
int green;
int timer;
boolean traffic = true;
public TrafficLight(int dic, int red, int green) {
super();
this.dic = dic;
this.red = red;
this.green = green;
}
}