본문 바로가기
Problem Solving/Baekjoon

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

by graycode 2022. 6. 6.

 문제 링크

 

2980번: 도로와 신호등

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

www.acmicpc.net

 

 풀이 과정

현재 위치(loc) 와 소요 시간(time) 을 나타내는 변수를 0으로 초기화, 이 후 각 신호등의 정보를 n회만큼 입력받는다.

1m 이동에 걸리는 소요 시간이 1초이므로 소요시간에 신호등 위치 - 현재 위치를 더해 시간의 경과를 나타내고,

현재 위치를 신호등의 위치로 갱신한다.

 

r + g를 신호등의 한 주기로 정의 시 time % (r + g) 현재 시간이 신호등의 주기 중 몇 초를 진행 중인지를 나타내며,

이 시간(state) 이 빨간불의 지속 시간보다 짧다면 아직 신호등을 기다리는 중이므로

r -state, 즉 빨간불이 남은 시간을 소요 시간에 더한다.

 

마지막으로 남은 구간, 도로의 길이 - 현재 위치(l - loc) 를 소요 시간에 더하여 정답이 구해진다.

 

 풀이 코드

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

public class Main {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringTokenizer st = new StringTokenizer(br.readLine());

		int n = Integer.parseInt(st.nextToken());
		int l = Integer.parseInt(st.nextToken());

		int loc = 0;
		int time = 0;
		for (int i = 0; i < n; i++) {
			st = new StringTokenizer(br.readLine());
			int d = Integer.parseInt(st.nextToken());
			int r = Integer.parseInt(st.nextToken());
			int g = Integer.parseInt(st.nextToken());

			time += d - loc;
			loc = d;

			int state = time % (r + g);
			if (state < r)
				time += r - state;
		}

		time += l - loc;

		bw.write(time + "\n");
		bw.flush();
	}

}

댓글