시리즈: 알고리즘 (32개 글)
- 자바로 알고리즘 풀기
- [Java] 백준 10431 - 줄 세우기
- [Java & Node.js] 백준 9935 - 문자열 폭발
- [Node.js] 백준 22866 - 탑 보기
- [Java] 백준 4485 - 녹색 옷 입은 애가 젤다지?
- [Node.js] 백준 1283 - 단축키 지정
- [Java & Node.js] 백준 14469 - 소가 길을 건너간 이유 3
- [Java] 백준 8979 - 올림픽
- [Node.js] 백준 22866 - 탑 보기
- [Java] 백준 7568 - 덩치
- [Java] 백준 1244 - 스위치 켜고 끄기
- [Node.js] 백준 19941 - 햄버거 분배
- [Node.js] 백준 1254 - 팰린드롬 만들기
- [Java] 백준 2589 - 보물섬
- [Java] 백준 2309 - 일곱 난쟁이
- [Java] 백준 1789 - 수들의 합
- [Java] 백준 1987 - 알파벳
- [Node.js] [Rust] 백준 24460 - 특별상이라도 받고 싶어
- [Node.js] 백준 7576 - 탑 보기
- [Rust] 백준 1047 - 울타리 (N^4 브루트포스 + 그리디)
- [Node.js] 백준 9657 - 돌게임3
- [Rust] 백준 4963 - 섬의 개수
- [Node.js] 프로그래머스 - 모의고사 / 실패율
- [Rust] 백준 2667 - 단지번호붙이기
- [Node.js] 프로그래머스 - 방문 길이
- [Node.js] 프로그래머스 - 괄호 회전하기
- [Rust] 백준 1002 - 터렛
- [Node.js] 프로그래머스 - 크레인 인형뽑기 게임
- [Node.js] 프로그래머스 - 기능개발
- [Rust] 백준 13717 - 포켓몬 GO
- [JavaScript] 백준 1092 - 배
- [Rust] 백준 25329 - 학생별 통화 요금 계산
백준 14469 - 소가 길을 건너간 이유3
이웃 농장의 소가 길을 마구잡이로 건너는 것에 진절머리가 난 존은 극단의 결정을 내린다. 농장 둘레에 매우 큰 울타리를 짓는 것이다. 이렇게 하면 근처 농장 출신의 소가 들어올 일이 거의 없다. 이 일로 주변 소들이 분개하였다. 친구네 집에 놀러 갈 수 없을 뿐만 아니라, 매년 참가하던 국제 젖 짜기 올림피아드에도 올해는 참가할 수 없게 되었기 때문이다.
이웃 농장의 소 중 존의 농장에 방문할 수 있는 소가 조금 있긴 하지만, 그들도 안심할 수 있는 건 아니다. 존의 농장에 들어가는 문은 하나밖에 없고, 그 문을 통과하려면 감시관의 길고 긴 검문을 받아야 한다. 여러 마리의 소가 한 번에 들어가려고 하면 줄이 그 만큼 길어진다.
N마리의 소가 이 농장에 방문하러 왔다. 소가 도착한 시간과 검문받는 데 걸리는 시간은 소마다 다르다. (물론 같을 수도 있다.) 두 소가 동시에 검문을 받을 수는 없다. 예를 들어, 한 소가 5초에 도착했고 7초 동안 검문을 받으면, 8초에 도착한 그 다음 소는 12초까지 줄을 서야 검문을 받을 수 있다.
모든 소가 농장에 입장하려면 얼마나 걸리는 지 구해보자.
접근
결국 모든 소가 들어간 시간을 출력한다고 이해했다.
시간을 비교하자!
- 도착시간에 검문이 진행중이지 않다면 현재 시간을 도착시간으로 변경
- 이미 검문이 진행중이라면, 검문이 끝나는 대로 다음 검문이 진행될 것이라 생각하고 검문 시간만을 더함
- 출력
이전에, 소들이 순서대로 올 수 있도록 도착 시간을 기준으로 정렬을 해준다!
코드
Node.js
const input = require("fs")
.readFileSync("/dev/stdin")
.toString()
.trim()
.split("\n");
const N = parseInt(input[0]);
const tmpCows = input.slice(1);
const infos = [];
for (let cow of tmpCows) {
const info = cow.split(" ").map(Number);
infos.push(info);
}
infos.sort((o1, o2) => o1[0] - o2[0]);
let curTime = 0;
for (let info of infos) {
if (info[0] > curTime) {
curTime = info[0];
curTime += info[1];
} else {
curTime += info[1];
}
}
console.log(curTime);
Java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException{
final BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
Info[] infos = new Info[N];
for (int i = 0; i < N; i++ ) {
st = new StringTokenizer(br.readLine());
int arrival = Integer.parseInt(st.nextToken());
int check = Integer.parseInt(st.nextToken());
infos[i] = new Info(arrival, check);
}
Arrays.sort(infos, (o1, o2) -> {
return o1.arrival - o2.arrival; // Arrival에 맞춰 오름차순 정렬
});
int curTime = 0;
for (Info info : infos ) {
if (info.arrival > curTime) {
curTime = info.arrival; // 도착시간으로 바로 설정
curTime += info.check; // 검문까지 바로
} else {
curTime += info.check;
}
}
System.out.println(curTime);
br.close();
}
static class Info {
int arrival;
int check;
public Info (int arrival, int check) {
this.arrival = arrival;
this.check = check;
}
}
}
결론
왜 소가 이렇게 수상하지?
크게 돌아가지 않고 도착 시간과, 검문에 걸리는 부분을 종이에 그려가며 쉽게 풀 수 있었다.
자바로 먼저 풀고, 노드로 다시 풀어보니 이번에는 또이또이한 문제인 것 같다.
Max를 쓰면 더 깔끔할 것 같다.
