개발/알고리즘 풀이

정올] 2247 도서관

펭귀니 :) 2019. 9. 30. 23:18

 

- 아이디어!

각 학생들의 입실시간과 퇴실시간을 기록하자!

배열로 각 학생들이 입퇴실 시간을 입력받고 입실시간 기준 오름차순 정렬하자!

 

/**************************************************************
    Problem: 2247
    User: s9msst
    Language: Java
    Result: Success
    Time:230 ms
    Memory:12388 kb
****************************************************************/
 
 
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.List;
import java.util.StringTokenizer;
 
public class Main {
 
    static class node {
        int s;
        int e;
 
        public node(int s, int e) {
            this.s = s;
            this.e = e;
        }
 
        public int getS() {
            return s;
        }
 
        public int getE() {
            return e;
        }
 
    }
 
    public static void main(String[] args) throws NumberFormatException, IOException {
 
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
 
        int N = Integer.parseInt(in.readLine());
        List<node> arr = new ArrayList<node>();
        int[] tmp = new int[2];
        int S = 0;
        int E = 0;
        int stayMax = 0; // 한사람이라도 있는 시간 최대값
        int notStayMax = 0;// 아무도 없는 시간 최대값
 
        // 입력값 배열에 저장하기
        for (int i = 0; i < N; i++) {
            StringTokenizer st = new StringTokenizer(in.readLine());
            S = Integer.parseInt(st.nextToken());
            E = Integer.parseInt(st.nextToken());
            arr.add(new node(S, E));
        }
 
        // 배열 정렬하기
//      arr.sort(Comparator.comparing(node::getS).thenComparing(node::getE).reversed());
//      arr.sort(Comparator.comparing(node::getS));
 
        Collections.sort(arr, new Comparator<node>() {
            @Override
            public int compare(node o1, node o2) {
                return o1.s - o2.s;
            }
        });
 
        for (int i = 0; i < N; i++) {
            node node = arr.get(i);
            S = node.s;
            E = node.e;
 
            if (S <= tmp[1]) { // 새로 들어온 S값이 전의 E값보다 작거나 같으면
                if (tmp[1] < E)
                    tmp[1] = E;
 
                if (stayMax < tmp[1] - tmp[0])
                    stayMax = tmp[1] - tmp[0];
 
            } else { // 새로 들어온 S값이 E보다 크면
                if (notStayMax < S - tmp[1]) 
                    notStayMax = S - tmp[1];
                 
                tmp[0] = S;
                tmp[1] = E;
            }
 
        }
 
        System.out.println(stayMax + " " + notStayMax);
 
    }
 
}

 

'개발 > 알고리즘 풀이' 카테고리의 다른 글

프로그래머스] 가장 큰 정사각형 찾기 (Java)  (0) 2020.02.10
SW Expert Academy] 1249 D4 보급로  (0) 2020.02.01
백준] 3055 탈출  (0) 2019.11.10
백준] 2636 치즈  (0) 2019.10.04
백준] 2630 색종이만들기  (0) 2019.10.04