요르딩딩
[코딩테스트] 백준 2980 : 도로와 신호등 (나머지연산/주기/if문) 본문
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
반응형
'[코딩테스트] > 문제풀이' 카테고리의 다른 글
[코테] 백준 : 14500 테트로미노 (0) | 2021.10.04 |
---|---|
백준 1063 : 킹 (char(알파벳)/.charAt(0)/switch문) (0) | 2021.09.08 |
[코테] 백준 : 2884 알람시계 (0) | 2021.08.18 |
[코딩테스트] 백준 2490: 윷놀이 (String.ValueOf, 배열.charAt[i]) (0) | 2021.08.13 |
[코딩테스트] 백준 10798: 세로읽기 (BufferedReader,readLine(), 2차원 배열) (0) | 2021.08.11 |
Comments