ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준]2170: 선 긋기 - JAVA
    문제풀이/백준 2021. 2. 18. 16:18

    [백준]2170: 선 긋기

     

    www.acmicpc.net/problem/2170

     

    2170번: 선 긋기

    첫째 줄에 선을 그은 횟수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 다음 N개의 줄에는 선을 그을 때 선택한 두 점의 위치 x, y(-1,000,000,000 ≤ x < y ≤ 1,000,000,000)가 주어진다.

    www.acmicpc.net

    풀이

    선의 정보를 입력 받은 후 계산을 순차적으로 진행하기 위해 x좌표를 기준으로 오름차순 정렬을 한다. x좌표가 같으면 y 좌표를 기준으로 오름차순 정렬 한다.

     

    이전 선의 정보를 min, max에 저장해 주었고 현재 선의 정보와 비교하면서 조건에 따라 길이를 계산해 주었다.

    선의 길이를 계산할 때 다음과 같은 3가지 조건이 있다.(이때 모든 선은 x, y기준으로 오름차순 정렬되어 있다.)

     

    (파란 선이 이전의 선이고 초록 선이 현재의 선 정보이다.)

    1. 이전의 선에 현재 선이 겹친다. 

    이럴 경우 계산하지 않고 무시하고 넘어가면 된다.

     

    2. 이전의 선에 현재 선의 일부가 겹친다.

    이럴 경우 현재 길이 정보에 더해야 하는 값은 7 - 5 = 2이다. 즉, 현재 선의 y좌표에서 이전 선의 y좌표를 뺀 값을 더해주면 된다.

     

    3. 이전의 선과 현재 선이 겹치지 않는다.

    이럴 경우에는 이전 선에 관계 없이 현재 선의 y좌표에서 x좌표를 뺀 값을 더해주면 된다.

     

    이 과정을 코드로 구현하면 된다-!

    (입력 받을때 scanner를 사용하면 시간 초과가 난다.)

    코드

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    import java.io.*;
    import java.util.*;
     
    public class Main {    
        
        public static void main(String[] args) throws NumberFormatException, IOException {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            
            int n = Integer.parseInt(br.readLine());
            int[][] pos = new int[n][2];
            int result=0;
            
            for (int i = 0; i < n; i++) {
                String line = br.readLine();
                int p1 = Integer.parseInt(line.split(" ")[0]);
                int p2 = Integer.parseInt(line.split(" ")[1]);
                pos[i][0= p1;
                pos[i][1= p2;
            }
            
            Arrays.sort(pos, new Comparator<int[]>() { //x좌표 오름차순 정렬. x좌표 같으면 y좌표 오름차순 정렬
                @Override
                public int compare(int[] o1, int[] o2) {
                    if(o1[0== o2[0])  return o1[1- o2[1];
                    else  return o1[0- o2[0];
                }
            }); 
            
            int min = pos[0][0];//이전 선의 x좌표
            int max = pos[0][1];//이전 선의 y좌표
            int len = max - min;
            for(int i = 1; i < n; i++) {
                if(min <= pos[i][0&& pos[i][1<= max) { //현재 선이 이전 선에 포함된다면
                    continue;
                } else if(pos[i][0< max) { //현재 선의 시작점이 이전 선에 포함된다면
                    len += pos[i][1- max;
                } else { //현재 선과 이전 선이 겹치지 않는다면
                    len += pos[i][1- pos[i][0];
                }
                min = pos[i][0];
                max = pos[i][1];
            }
            System.out.println(len);
        }
    }
    cs

    '문제풀이 > 백준' 카테고리의 다른 글

    [백준]5052: 전화번호 목록 - JAVA  (0) 2021.02.20
    [백준]1520: 내리막 길 - JAVA  (0) 2021.02.19
    [백준]2341: DDR - JAVA  (0) 2021.02.18
    [백준]1238: 파티 - JAVA  (0) 2021.02.17
    [백준]11404: 플로이드 - JAVA  (0) 2021.02.17

    댓글

Designed by Tistory.