728x90
반응형
2024.06.14기준 - 실버3
백준, BEAKJOON, BOJ, JAVA, 자바
풀이
이 문제는 입력 받은 정보로 육교와 횡단보도를 이용해 가장 빠르게 학교에 도착하는 시간을 구하는 문제입니다.
입력받는 값 4가지는 횡단보도를 건너는 시간, 육교를 건너는 시간, 녹색불이 켜지는 시간, 적색불이 켜지는 시간 입니다.
저의 접근은 녹색과 적색 신호등을 파악하는게 포인트 였습니다.
현재 지나간 시간과 총 녹색과 적색의 사이클을 나눈 나머지 값을 통해 녹색불인지 적색불인지 판단을 해줬습니다.
1. 횡단보도, 육교, 녹색 신호등, 적색 신호등, 신호등 사이클을 담을 수 있는 커스텀 클래스 Line을 생성했습니다.
public static class Line {
int crosswalk, overpass, green, red, total;
public Line(int c, int o, int g, int r, int t) {
crosswalk = c;
overpass = o;
green = g;
red = r;
total = t;
}
}
2. 생성된 클래스를 배열로 선언한 뒤 입력받은 값들을 전부 저장 했습니다.
3. 입력받은 값으로 총 시간을 계산합니다.
- (총 시간) % (신호등 사이클) 이 녹색등 보다 작다면 녹색등이 켜져있다는 소리입니다.
- 녹색등이지만 육교가 더 빠르다면 육교로 이동을 합니다.
- 아니라면 횡단보도를 이용합니다.
- (총 시간) % (신호등 사이클) 이 녹색등 보다 크거나 같다면 적색불이라는 소리입니다.
- 적색이지만 적색을 기다리고 횡단보도를 건너는 시간이 육교보다 빠르다면 (신호등을 기다리는 시간) + (횡단보도 건너는 시간) 을 더해줍니다.
- 아니라면 육교를 건너는 시간을 더해 줍니다.
코드
package Main;
import java.io.*;
import java.util.*;
public class Main {
public static class Line {
int crosswalk, overpass, green, red, total;
public Line(int c, int o, int g, int r, int t) {
crosswalk = c;
overpass = o;
green = g;
red = r;
total = t;
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine()); // 횡단보도의 수
StringTokenizer st;
Line[] arr = new Line[n];
int c, o, g, r, t;
for (int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine());
c = Integer.parseInt(st.nextToken()); // 횡단보도
o = Integer.parseInt(st.nextToken()); // 육교
g = Integer.parseInt(st.nextToken()); // 녹색 신호등
r = Integer.parseInt(st.nextToken()); // 적색 신호등
t = g + r; // 신호등이 도는 사이클 시간
arr[i] = new Line(c, o, g, r, t);
}
int signal;
int count = arr[0].crosswalk > arr[0].overpass ? arr[0].overpass : arr[0].crosswalk; // 첫 번째 길은 둘 중에 적은 곳으로 건넌다.
for (int i = 1; i < n; i++) {
signal = count % arr[i].total;
if (signal < arr[i].green) { // 녹색불일때
if (arr[i].overpass < arr[i].crosswalk) {
// 녹색이지만 육교가 더 짧을 때.
count += arr[i].overpass;
} else {
// 횡단보도가 더 짧을 때
count += arr[i].crosswalk;
}
} else { // 적색불일때
if (arr[i].total - 1 - signal + arr[i].crosswalk < arr[i].overpass) {
// 적색이지만 적색을 기다리고 횡단보도를 건너는 시간이 육교보다 짧을 때.
count += arr[i].total - signal + arr[i].crosswalk;
} else {
// 육교가 더 짧을 때
count += arr[i].overpass;
}
}
}
bw.write(Integer.toString(count));
bw.flush();
bw.close();
br.close();
}
}
728x90
반응형
'코딩테스트 일기 (BAEKJOON)' 카테고리의 다른 글
BAEKJOON / 백준 - JAVA 31925번 APC2shake! (0) | 2024.06.17 |
---|---|
BAEKJOON / 백준 - JAVA 31924번 현대모비스 특별상의 주인공은? 2 (0) | 2024.06.16 |
BAEKJOON / 백준 - JAVA 31884번 Stacking Sticks (0) | 2024.06.12 |
BAEKJOON / 백준 - JAVA 31882번 근수 (2) | 2024.06.10 |
BAEKJOON / 백준 - JAVA 31881번 K512에 바이러스 퍼뜨리기 (0) | 2024.06.09 |