Algorithm PS/Baekjoon Online Judge
[BOJ/백준] 2170 선 긋기 (G5)
kyung.Kh
2024. 5. 17. 18:13
문제
https://www.acmicpc.net/problem/2170
풀이
선의 정보를 입력받은 후 계산을 순차적으로 하기 위해 선의 시작 지점을 기준으로 오름차순 정렬하였으며 시작 지점이 같은 경우에는 끝 지점을 기준으로 오름차순 정렬하였다.
처음에 이전 선의 정보를 start에 시작 지점을 저장하고 end에 선의 끝 부분을 저장했다. 그리고 end - start로 현재까지의 선의 길이를 저장했다.
이제 이후의 선들을 비교할 때마다 3가지 조건에 맞게 계산을 해줘야 한다.
- 현재 선이 이전 선에 겹치는 경우(현재 선이 이전 선에 포함되는 경우) → continue로 넘어간다.
- 현재 선의 시작 지점이 이전 선에 겹치는(포함되는) 경우 → 현재 선의 끝 지점 - 이전 선의 끝 지점(end)를 length에 더해준다.
- 현재 선이 이전 선과 겹치지 않는 경우 → 현재 선의 끝 지점 - 현재 선의 시작 지점을 length에 더해준다.

그리고 매 조건이 끝날 때마다 다음 루프를 위해 현재 선의 정보를 start와 end에 저장해야 한다.
Code
import java.util.*;
import java.io.*;
public class BOJ_2170 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st;
int N = Integer.parseInt(br.readLine());
int arr[][] = new int [N][2];
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
arr[i][0] = Integer.parseInt(st.nextToken());
arr[i][1] = Integer.parseInt(st.nextToken());
}
Arrays.sort(arr, new Comparator<int[]>() {
public int compare(int o1[], int o2[]) {
if (o1[0] == o2[0]) {
return o1[1] - o2[1];
} else {
return o1[0] - o2[0];
}
}
});
int start = arr[0][0];
int end = arr[0][1];
int length = end - start;
for (int i = 1; i < N; i++) {
if (start <= arr[i][0] && end >= arr[i][1]) { // 선이 완전히 겹치는 경우(포함된 경우)
continue;
} else if (arr[i][0] < end) { // 현재 선의 시작 부분이 이전 선에 포함된다면
length += arr[i][1] - end; // 길이에 증가된 길이만큼 추가
} else { // 현재 선 밖으로 나간 경우(겹치지 않는 경우)
length += arr[i][1] - arr[i][0];
}
start = arr[i][0]; // 다음 루프에서 비교될 현재 선을 짖정
end = arr[i][1];
}
bw.write(length + "");
bw.flush();
bw.close();
}
}
728x90