2021-01-21
문제
선물 포장 공장을 말아먹은 욱제는 계곡에서 백숙을 파느라 학교에 자주 가지 못한다. 하지만 월클의 인생은 피곤한 법! 욱제는 지금처럼 힘든 시기에도 자신을 기다리는 5조5억명의 열렬한 팬들을 위해 가끔씩 학교에 가 줘야 한다. 욱제는 백숙이 끓는 걸 지켜봐야 해서 가게를 오래 비울 수 없다. 그래서 욱제는 한 번 학교에 간 뒤 최소 시간동안 머물다가 모든 팬들과 한 번씩 인사를 하고 학교를 떠나려고 한다.
욱제는 임의의 시각에 학교에 오거나 학교를 떠날 수 있고, 단 한 번의 왕복만 한다. 동시에 여러 팬들에게 인사를 끝낼 수도 있다. 욱제는 잘생겨서 인사하면 팬들이 심쿵사로 바로 쓰러지기 때문에 인사를 하는데 소요되는 시간은 0이라고 하자.
예를 들어 3명의 팬 A, B, C가 학교에 머무르는 시간이 <그림 1>과 같다고 하자. 이 경우 시각 2에 3명의 팬이 모두 학교에 있으므로, 욱제는 시각 2에 학교에 와서 3명에게 동시에 인사를 하고 바로 가게로 돌아갈 수 있다. 시각 3이나 4도 마찬가지이다. 이때 욱제가 학교에 머무는 시간의 총합은 0이다.
다른 예로 2명의 팬 A와 B가 학교에 있는 시간이 <그림 2>와 같다고 하자. 욱제는 시각 4부터 시각 5까지 학교에 머물면서 시각 4에 A와, 시각 5에 B와 인사를 하고 학교를 떠날 수 있다. 이때 욱제가 학교에 머무는 시간은 1이다.
백숙집 주방 이모 효빈이는 N명의 팬들이 학교에 머무르는 시간 [s, e]들을 몰래 조사했다. 효빈이는 욱제가 학교에 머무르는 시간을 계산해서 그 시간동안 땡땡이를 치기로 했다. 효빈이와 함께 욱제가 학교에 머무르는 최소의 시간을 계산해 보자!
입력
첫째 줄에 욱제의 열렬한 팬의 수 N이 주어진다. (1 ≤ N ≤ 100,000)
둘째 줄부터 N개의 줄에 걸쳐, 각 줄에 정수 si, ei (1 ≤ si ≤ ei ≤ 100,000)가 순서대로 주어진다. 이는 i번째 팬이 학교에 있는 시간 [si, ei]을 의미한다.
출력
욱제가 학교에 머물러야 하는 최소의 시간을 출력한다.
import java.util.Scanner;
public class TemplateA {
public static void main(String[] args){
Scanner scan = new Scanner (System.in);
int fan = scan.nextInt();
int [][] arr = new int [fan][2];
for(int i =0; i < fan; i++) {
for(int j = 0; j < 2; j++) {
arr[i][j] = scan.nextInt();
}
}
int start = arr[0][0];
//초기 시작값은 처음 학생의 머무는 시간으로 준다.
int end = arr[0][1];
//초기 끝값은 처음 학생의 머무는 시간으로 준다.
//(사실 어떤학생을 주던 크게 상관은 없는데, 순서 때문에 구현하기 까다로워짐)
int count = 0;
//머무는 시간을 셀 변수
for(int i = 1; i < fan; i++) {
//첫학생은 이미 초기값 셋팅으로 들어가 있음으로
// 2번째 학생부터 비교하면됨
for(int j = 0; j < 1; j++) {
if(arr[i][j + 1] < start) {
count += start - arr[i][j + 1];
start = arr[i][j];
//학생의 머무는 시간의 끝값이 다른 학생의 스타트 값보다
//작으면, 겹치는 시간이 없음
//머무는 시간에 둘의 차를 더해주고
//시작값은 더 먼저 도착하는 학생의 값으로 변경한다.
}else {
if(arr[i][j] > end) {
count += arr[i][j] - end;
end = arr[i][j + 1];
}
// end 값에 저장된 학생의 값보다 다른 학생의 시작하는 값이 크면,
//마찬가지로 겹치는 시간이 없음 때문에 끝값은 그 다른 학생이 떠나는 시간으로 초기화하고
// 카운트에 해당하는 값들의 차이를 넣어줌
}
}
}
System.out.println(count);
}
}
출처링크 : www.acmicpc.net/problem/17262