공부공간

JUNGOL - 1828 ) 냉장고 본문

알고리즘/구현,시뮬

JUNGOL - 1828 ) 냉장고

개발자가될수있을까? 2020. 2. 13. 09:33

http://jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=1101&sca=3050

 

JUNGOL | 냉장고 > 문제은행

N개의 화학 물질 C1, C2, …, Cn이 있다.  이들 각각은 보관되어야 할 온도가 각기 다른데, 각 Ci마다 최저 보관 온도 xi와 최고 보관 온도 yi가 정해져 있다.  즉 Ci는 온도 xi이상, yi이하의 온도에서 보관되어야만 안전하다. 이 화학 물질들을 모두 보관하기 위해서는 여러 대의 냉장고가 필요한데 가능하면 적은 수의 냉장고를 사용하고 싶다.  이를 해결하는 프로그램을 작성하시오.

jungol.co.kr


 

PriorityQueue 연습문제로 class의 특정 인스턴스를 기준으로 정렬하였다.

 

냉장고 문제는 최고 보관온도와 최저 보관온도를 각각가진 화학물질을

 

일정한 온도를 유지하는 냉장고에 보관하되, 최저의 냉장고수를 출력하는 문제이다.

 

입력을 받을때에 최저 보관 온도를 기준으로  오름차순 정렬하여 큐에 넣었다.

 

큐에서 하나씩 빼면 항상 최저 보관온도의 최솟값이 보장된다.

 

하나의 화학약품에 대해서 최고보관온도를 넘으면 냉장고 수가 한대더 필요하게된다.

 

( 큐에서 뽑았을때에 이전것의 최댓값이 현재의 최솟값 보다 작은경우 )

 

그런게 아니라면 이전냉장고로 현재약품을 보관할수 있다.

 

이전냉장고의 최댓값은 현재의 최댓값으로 업데이트해야한다.

 

전체 Queue가 빌때까지 위 과정을 반복한다.


package practice;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.StringTokenizer;

public class 냉장고 {
    static class pos{
        int min,max;
        public pos(int min, int max) {
            this.min =min;
            this.max =max;

        }
    }
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int t = Integer.parseInt(st.nextToken());
        PriorityQueue<pos> pq = new PriorityQueue<>(1,
                new Comparator<pos>(){
                    public int compare(pos p1, pos p2) {
                        if(p1.min > p2.min) return 1;
                        else return -1;
                    }
                }
                );
        for(int index = 0 ; index < t ; index++) {
            st = new StringTokenizer(br.readLine());
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());
            pq.add( new pos (a,b));
        }
        int answer =0; int min =Integer.MIN_VALUE,max =Integer.MIN_VALUE;
        while(!pq.isEmpty()) {

            pos now = pq.poll();
            if(now.min > max) {
                answer ++; //  냉장고가 필요한 경우
                           //  다음은 
                min = now.min;
                max = now.max;
                continue;
            }
            if(max > now.max) {
                max = now.max;
            }

        }
        System.out.println(answer);
    }

}


Comments