728x90

문제

 

 

접근 방식

1 3
2 5
3 5
6 7

 

위와 같이 일직선 상의 선분의 시작점과 끝점이 주어졌을 때

시작점이 가장 작은 순으로 정렬하고 각 선분을 그어보면

세 가지 경우로 선분을 그을 수 있는데

1 2 3 4 5 6 7
1   3
  2     5
    3   5
          6 7

 

위와 같이 처음 1-3 선분이 있을 때

다음에 오는 2-5 선분은 이전 1-3선분에 겹치면서 길이가 조금 더 긴 경우

3-5 선분은 이전 선분 자체에 모두 겹치는 경우

6-7 선분은 겹치지 않는 새로운 선분인 경우다.

 

완전히 새로운 경우에는 끝점 - 시작점으로 선분의 길이를 구할 수 있고

겹치는 경우에는 겹치지 않는 경우만 계산하면 되기 때문에

현재 선분의 끝점에서 이전 선분의 끝점을 빼주면 되고

완전히 겹치는 경우에는 계산할 필요가 없다.

풀이

public class Main {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;

		int n = Integer.parseInt(br.readLine());
		int[][] xy = new int[n][2];

		for (int i = 0; i < n; i++) {
			st = new StringTokenizer(br.readLine());

			xy[i][0] = Integer.parseInt(st.nextToken());
			xy[i][1] = Integer.parseInt(st.nextToken());
		}

		Arrays.sort(xy, (o1, o2) -> o1[0] != o2[0] ? o1[0] - o2[0] : o1[1] - o2[1]);

		int s = xy[0][0];
		int e = xy[0][1];
		int len = e - s;

		for (int i = 1; i < n; i++) {
			int x = xy[i][0];
			int y = xy[i][1];

			if (y <= e) continue;

			if (x <= e) {
				len += (y - e);
			} else {
				len += y - x;
			}

			e = y;
		}

		System.out.println(len);
	}
}

 

'Java > Algorithms' 카테고리의 다른 글

[백준] 1700번 : 멀티탭 스케줄링  (0) 2024.01.17
[백준] 1744번 : 수 묶기  (0) 2024.01.11
[백준] 2457번 : 공주님의 정원  (0) 2024.01.10
[백준] 1541번 : 잃어버린 괄호  (0) 2024.01.10
[백준] 11501번 : 주식  (1) 2024.01.10

+ Recent posts