백준 2980번( 자바 )

Flash·2022년 1월 9일
0

BOJ-Algorithm

목록 보기
20/51
post-thumbnail

구현

백준 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;
        }
    }
}

profile
개발 빼고 다 하는 개발자

0개의 댓글