코딩테스트/백준

[백준]2980번 도로와 신호등 - Java

GAEBAL 2022. 3. 2. 23:18
728x90

문제

https://www.acmicpc.net/problem/2980

 

2980번: 도로와 신호등

상근이는 트럭을 가지고 긴 일직선 도로를 운전하고 있다. 도로에는 신호등이 설치되어 있다. 상근이는 각 신호등에 대해서 빨간 불이 지속되는 시간과 초록 불이 지속되는 시간을 미리 구해왔

www.acmicpc.net

 

풀이

왜 그랬는지 모르겠는데 % 연산을 / 연산으로 놔두고 왜 안되는지 다 찍어보느라 개ㅐㅐㅐㅐ오랫동안 찾은 것 같다,,, 너무 어이가 없었다

암튼 신호등들의 정보를 배열에 저장해 두었다가 while(true){ } 안에서 time과 current를 증가해주면서 이동시켜 주었다

그러다 상근이가 신호등이 있는 위치에 도달하면 check() 함수에 현재 time과 신호등의 정보를 변수로 넘겨주어 신호등이 빨간불이면 몇초가 남았는지, 초록불이면 0초를 반환하여 그만큼 time을 증가시켜 주었다.

 

코드

// 2980번 도로와 신호등
// https://www.acmicpc.net/problem/2980

package BAEKJOON;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Num2980_도로와신호등 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int N = Integer.parseInt(st.nextToken());
        int L = Integer.parseInt(st.nextToken());
        int[][] arr = new int[N][3];

        for (int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine());
            arr[i][0] = Integer.parseInt(st.nextToken()); // 신호등 위치
            arr[i][1] = Integer.parseInt(st.nextToken()); // 빨간불 지속시간
            arr[i][2] = Integer.parseInt(st.nextToken()); // 초록불 지속시간
        }

        int current = 0; // 현재 위치
        int time = 0;

        while (true) {
            if (current == L) {
                break;
            }

            for (int i = 0; i < N; i++) {
                if (current == arr[i][0]) { // 현재위치에 신호등이 있는 경우

                    if (check(time, arr[i][1], arr[i][2]) == 0) {
                        break;
                    } else if (check(time, arr[i][1], arr[i][2]) != 0) {
                        time += check(time, arr[i][1], arr[i][2]);
                        break;
                    }
                }
            }

            current++;
            time++;
        }

        System.out.println(time);
    }

    // 지금 건널 수 있는지 없는지 알려주는 함수
    public static int check(int time, int R, int G) {
        if (time > (R + G)) {
            time = time % (R + G);
        }

        if (time <= R) {
            return R - time;
        } else if (time > R) {
            return 0;
        }

        return 0;
    }

}
728x90