요르딩딩

[코딩테스트] 백준 2980 : 도로와 신호등 (나머지연산/주기/if문) 본문

[코딩테스트]/문제풀이

[코딩테스트] 백준 2980 : 도로와 신호등 (나머지연산/주기/if문)

요르딩딩 2021. 9. 4. 22:22
728x90
반응형
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;	
	
public class Main{
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		String[] a1 = br.readLine().split(" ");

		int count = Integer.parseInt(a1[0]);
		int len   = Integer.parseInt(a1[1]);

		// 2차원 배열로 세팅
		String[][] arr = new String[count][3];
		for (int j = 0; j < count; j++) {
			arr[j] = br.readLine().split(" ");
		}
		
		// 2차배열 int로 변환
		Integer[][] arrInt = new Integer[count][3];
		for (int i = 0; i < count; i++) {
			for (int j = 0; j < 3; j++) {
				arrInt[i][j] = Integer.parseInt(arr[i][j]);
			}
		}

		int result = 0;
		for (int i = 0; i < count; i++) {
			if (i == 0) { //1. 처음거리이동 = 대기시간없음
				result += Integer.parseInt(arr[i][0]); // 거리이동 (거리1 = 시간1)
			}
			else { //2. 중간거리이동
				result += Integer.parseInt(arr[i][0]) - Integer.parseInt(arr[i-1][0]); // 거리이동 (거리1 = 시간1)
			}

			while(true){
				int mod = result % (arrInt[i][1]+ arrInt[i][2]);
				if (mod < arrInt[i][1]) { //신호등 주기에 따른 대기시간 추가 : 주기 =빨간불+초록불 
					result += arrInt[i][1] - mod; //현재시간%주기가 빨간불시간보다 작을 경우 = 빨간불이다.				
					break;
				}
				else { //초록불일때 pass
					break;
				}
			}
		}
		result += len - Integer.parseInt(arr[count - 1][0]); //3. 마지막거리 이동
		
		System.out.println(result);
    }		
}

이번 코테문제는 생각보다 어려웠다.

여러가지 케이스를 생각해야했던거 같고, 깔끔하게 정리가 되지 않았던거 같다.

 

역시 이번문제도 규칙을 찾는것이 관건이었다.

그 규칙을 생각하기가 쉽진 않았던거 같다. 

항상 이러한 문제를 풀때는 공통화 할 수 있는 부분을 떠올리는 것이 핵심인거 같다.

 

이 문제에서는 빨간불/초록불의 주기를 이용하여 푸는것이(나머지 연산자 이용) 생각하기 어려웠던거 같다.

그리고 거리이동할때 1.처음일때, 2.거리간의 이동일때 3.마지막 거리이동 이렇게 나눠서 계산해주는 부분도 썩 마음에 들지는 않는거 같다.

 

다음번에 이와비슷한 문제를 풀때 이번에 어렵게 생각했던 부분들을 떠올리면 풀어봐야 한다. 꼭

 

728x90
반응형
Comments