백준 2980번 구현 문제를 Java로 풀어보았다.
신호등이 여러 개 있는 도로의 끝까지 갈 때 몇 초가 걸리는지 구하는 문제다.
타겟 신호등까지의 이동 시간을 기준으로 타겟 신호등이 빨간불인지 초록불인지 알아내어 대기 시간이 몇 초인지 알아내고 총 걸린 시간에 더해주며, 만약 초록불이라면 그냥 지나가면 된다.
빨간불일지 초록불일지 알아내는 것은 간단하다.
빨간불과 초록불의 지속 시간을 더해주어 신호등마다 한 term
을 구해주고 몇 term
째인지 알아내어, 그만큼의 시간을 빼주어 0번째 term
을 가정하고 빨간불인지 초록불인지 판단하면 된다.
이 로직을 코드로 구현하면 다음과 같다.
int curTime = 0;
for(int i=0; i<n; i++){
if(i==0){ // 첫 신호를 만날 때
curTime += lights[i].position;
}
else{ // 두 번째부터는 이전 위치로부터 증가한 만큼만 시간 추가
curTime += (lights[i].position - lights[i-1].position);
}
int terms = curTime / (lights[i].red + lights[i].green); // 몇 텀째인지
int tmpTime = curTime - (terms * (lights[i].red + lights[i].green)); // 그만큼의 시간을 빼주자
if(tmpTime<lights[i].red) // 만약 빨간불을 만나 대기해야한다면
curTime += (lights[i].red - tmpTime); // 요만큼 대기해야함
else // 초록불이면 그냥 지나가면 됨
continue;
}
curTime += (l - lights[n-1].position); // 마지막 신호등을 지났으면 끝까지 가는 데 걸린 시간을 더해주자
간단한 구현문제였다.
다음은 내가 제출한 코드다.
import java.util.*;
import java.io.*;
public class boj2980 {
public static void main(String args[]) throws IOException {
BufferedReader bfr = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bfw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer stk = new StringTokenizer(bfr.readLine());
int n = Integer.parseInt(stk.nextToken());
int l = Integer.parseInt(stk.nextToken());
Light[] lights = new Light[n+1];
for(int i=0; i<n; i++){
stk = new StringTokenizer(bfr.readLine());
int pos = Integer.parseInt(stk.nextToken());
int red = Integer.parseInt(stk.nextToken());
int green = Integer.parseInt(stk.nextToken());
lights[i] = new Light(pos, red, green);
}
int curTime = 0;
for(int i=0; i<n; i++){
if(i==0){ // 첫 신호를 만날 때
curTime += lights[i].position;
}
else{ // 두 번째부터는 이전 위치로부터 증가한 만큼만 시간 추가
curTime += (lights[i].position - lights[i-1].position);
}
int terms = curTime / (lights[i].red + lights[i].green); // 몇 텀째인지
int tmpTime = curTime - (terms * (lights[i].red + lights[i].green)); // 그만큼의 시간을 빼주자
if(tmpTime<lights[i].red) // 만약 빨간불을 만나 대기해야한다면
curTime += (lights[i].red - tmpTime); // 요만큼 대기해야함
else // 초록불이면 그냥 지나가면 됨
continue;
}
curTime += (l - lights[n-1].position);
bfw.write(String.valueOf(curTime));
bfw.close();
}
static class Light{
int position;
int red;
int green;
public Light(int position, int red, int green){
this.position = position;
this.red = red;
this.green = green;
}
}
}