ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 22867 종점
    백준/파싱 2022. 6. 9. 21:57

     

     

    1. 풀이

     

     

    1) 입력값 변환

     

    예제에 보면

    입력값이 

     

    06:00:00.000 06:30:00.000

     

    이런식으로 되어 있다.

    이 값들을 String으로 받은 뒤,

     

    :.를 공백으로 바꿔준다.

     

    이때 replaceAll 메서드를 사용한다.

    06:00:00.000 

    이 값이 String a 라고 하면,

     

    		a= a.replaceAll("[.:]", "");

    이런식으로 바꿔주면 된다.

     

    1) 

    앞부분 =>  "[.:]" 

    정규표현식을 사용한 것이다.

    즉 문자 "." 또는 ":" 를 의미한다.

     

    2) 

    뒷부분 => ""

    즉 공백을 의미한다.

     

    3) 

    결론 => 

    문자 "." 또는 ":" 를 공백으로 바꾸라는 의미이다.

     

     

     

     

    그러면

     

    06:00:00.000 

    이 값은 

    replaceAll 메서드 적용 뒤

     

    060000000 

    이렇게 된다.

     

    그 후 이 값을 int 형으로 바꿔준다.

    그러면  

    60000000 

    이렇게 된다.

     

    이런 식으로 입력값들을 바꿔주면 된다.

     

     

    2) 리스트에 입력값 넣기

     

    예제에 나온 값들을 위와 같이 변환해 준 뒤,

    리스트에 

    (버스가 종점에 들어오는 시각, 나가는 시각) 을 쌍으로 넣어준다.

     

    그런 다음 리스트를

    들어오는 시각 기준 오름차순 정렬,

    나가는 시각 기준 오름차순 정렬해준다.

     

    그러면 아래의 예제 입력값은

     

    06:00:00.000 06:30:00.000
    06:10:45.000 06:15:00.000
    06:30:00.000 06:40:00.000
    06:01:00.001 06:40:00.001

     

    아래와 같이 변해서 리스트에 정렬되어 있는 상태이다.

     

     

    60000000  63000000
    60100001  64000001
    61045000  61500000
    63000000  64000000

     

    3) 우선순위 큐 사용

     

     

    그러면 이제 우선순위 큐를 사용해보자.

    우선순위 큐는 오름차순 정렬이다.

     

    우선순위 큐에는 

    버스가 종점에서 나가는 시각만 넣을 것이다.

     

    1. 첫 번째

     

    우선순위 큐에 아무 값도 없으므로 첫 번째 버스의 종점에서 나가는 시각, 

    즉 63000000 값을 우선순위 큐에 넣는다.

     

     

    2.  두 번째

     

    두 번째 버스의 도착 시간(60100001) 과

    우선순위 큐의 맨 위에 있는 값, 즉 첫번째 버스의 종점에서 나가는 시각(63000000) 을 비교한다.

     

    예를 들어

    첫 번째 버스의 나가는 시각 <= 두 번째 버스의 도착 시각

    이면, 

    첫 번째 버스가 종점에서 나간 다음에

    두 번째 버스가 들어오기 때문에, 

    첫 번째 버스는 나간 상태이다.

    그래서 첫 번째 버스의 종점에서 나가는 시각을 우선순위 큐에서 제거해준다.

    그리고 두 번째 버스의 종점에서 나가는 시각을 우선순위 큐에 넣어준다.

     

    즉, 우선순위 큐를 통해 동시에 종점에 있는 버스들을 알 수 있다.

     

    하지만 이 경우는 

    첫번째 버스의 나가는 시각 > 두번째 버스의 도착 시각

    이므로, 그냥 두번째 버스의 종점에서 나가는 시각(64000001) 을 우선순위 큐에 넣어주면 된다.

     

    그리고 우선순위 큐 사이즈 중

    가장 큰 값을 정답으로 출력하면 된다.

     

     

    2. 최종 코드

     

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Comparator;
    import java.util.PriorityQueue;
    import java.util.StringTokenizer;
    
    
    class Time{
    	int one;
    	int two;
    	
    	Time(int one, int two) {
    		this.one = one;
    		this.two = two;
    	}
    }
    
    
    public class Main {
    
    	public static void main(String[] args) throws IOException {
    		
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    		int N = Integer.parseInt(br.readLine());
    
    		ArrayList<Time> input = new ArrayList<>();
    		
    		for(int i=0; i<N; i++ ) {
    			
    			StringTokenizer st = new StringTokenizer(br.readLine(), " ");
    			
    			String a = st.nextToken();
    			String b = st.nextToken();
    			a= a.replaceAll("[.:]", "");
    			b= b.replaceAll("[.:]", "");
    	
    			input.add(new Time(Integer.parseInt(a),Integer.parseInt(b)));
    		}
    		
    	
    		
    		Collections.sort(input, new Comparator<Time>() {
    			@Override
    			public int compare(Time t1, Time t2) {
    				if(t1.one == t2.one) {
    					return t1.two - t2.two;
    				}else {
    					return t1.one - t2.one;
    				}
    			}
    		});
    		
    
    		PriorityQueue<Integer> result  = new PriorityQueue<>();
    	
    		int max = -1;
    		for(int i=0; i<input.size(); i++) {
    			
    			int value1 = input.get(i).one;
    			int value2 = input.get(i).two;
    			
    			while(!result.isEmpty() && result.peek()<= value1) {
    				
    				result.poll();
    				
    			}
    		
    			result.add(value2);
    			max = Math.max(max, result.size());
    			
    		}
    		
    		System.out.println(max);
    	}
    }

     

     

    '백준 > 파싱' 카테고리의 다른 글

    1541 잃어버린 괄호  (0) 2022.06.28

    댓글

Designed by Tistory.