티스토리 뷰

<정올 1828번. 냉장고>

- Greedy 그리디 문제

문제

N개의 화학 물질 C1, C2, …, Cn이 있다. 

이들 각각은 보관되어야 할 온도가 각기 다른데, 각 Ci마다 최저 보관 온도 xi와 최고 보관 온도 yi가 정해져 있다. 

즉 Ci는 온도 xi이상, yi이하의 온도에서 보관되어야만 안전하다.

 

이 화학 물질들을 모두 보관하기 위해서는 여러 대의 냉장고가 필요한데 가능하면 적은 수의 냉장고를 사용하고 싶다. 

이를 해결하는 프로그램을 작성하시오.

 

입력형식

첫줄에 화학물질의 수 N이 입력된다. N의 범위는 1이상 100 이하이다. 

두 번째 줄부터 N+1줄까지 최저보관온도와 최고보관온도가 입력된다. 

보관온도는 -270° ~ 10000°이며, 각 냉장고는 임의의 정해진 온도를 일정하게 유지할 수 있고, 냉장고는 아주 크다고 가정한다.

 

출력형식

첫줄에 최소로 필요한 냉장고의 대수를 출력한다.

 

 

소스코드

import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;

public class Main_1828_냉장고 {
	
	static class Temp implements Comparable<Temp>{		// 화학물질은 온도 정보
		public int lowest;	// 최저 보관 온도
		public int highest;	// 최고 보관 온도
		
		public Temp(int lowest, int hightet) {
			super();
			this.lowest = lowest;
			this.highest = hightet;
		}

		@Override
		public int compareTo(Temp o) {	//먼저 최고 기온을 기준으로 정렬(오름차순) 한 후, 만약 최고 기온이 같다면 최저 기온을 기준으로 정렬(오름차순) 한다.
			int diff = this.highest - o.highest;
			return diff != 0 ? diff : this.lowest-o.lowest;
		}
	}

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int N = sc.nextInt();	// 화학물질의 수
		int count = 0;		// 냉장고 개수
		int curLow = 0;		// 현재 냉장고의 최저온도
		int curHigh = 0;	// 현재 냉장고의 최고온도
		
		Temp[] temps = new Temp[N];
		
		for(int i=0; i<N; i++) {
			temps[i] = new Temp(sc.nextInt(), sc.nextInt());	// 데이터 입력
		}
		
		/*// 최고보관온도를 기준으로 오름차순 정렬
		for(int i=0; i<N; i++) {
			for(int j=i+1; j<N; j++) {
				if(temps[i].highest > temps[j].highest) {
					Temp temp = temps[i];
					temps[i] = temps[j];
					temps[j] = temp;
				}
			}
		}*/
		
		Arrays.sort(temps);    // 최고 온도를 기준으로 오름차순 정렬
		
		// 첫번쨰 냉장고의 온도를 첫번쨰 화학물질의 온도로 셋팅
		curLow = temps[0].lowest;
		curHigh = temps[0].highest;
		count++;
		
		for(int i=1; i<N; i++) {
			if( temps[i].lowest > curHigh ) {	// 현재 냉장고의 최고 온도보다 높은 최저온도의 재료를 만나면
				curLow = temps[i].lowest;		// 그 재료의 최저온도로 냉장고를 셋팅
				curHigh = temps[i].highest;		// 그 재료의 최고온도로 냉장고를 셋팅
				count++;	// 냉장고 추가
			}
		}
		System.out.println(count);
	}
}

 

 

풀이

1. 최고 온도를 기준으로 오름차순으로 정렬

 

 ==> Temp class를 작성했기 때문에,

Comparable을 implements하여 compareTo를 오버라이딩하여 사용.

@Override
public int compareTo(Temp o) {	//먼저 최고 기온을 기준으로 정렬(오름차순) 한 후, 만약 최고 기온이 같다면 최저 기온을 기준으로 정렬(오름차순) 한다.
    int diff = this.highest - o.highest;
    return diff != 0 ? diff : this.lowest-o.lowest;
}

먼저 최고 기온을 기준으로 정렬(오름차순) 한 후, 만약 최고 기온이 같다면 최저 기온을 기준으로 정렬(오름차순) 한다.

 

 

2. 첫번째 화학물질의 최고온도를 curHigh, 최저온도를 curLow로 둔다.

 

 

3. 두번째 화학물질의 최저온도 (temps[i].lowest) 가 curHigh 보다 더 낮다면 같은 냉장고 사용,

최저온도 (temps[i].lowest) 가 curHigh 보다 더 높다면 같은 냉장고를 사용할 수 없음을 의미한다.

 

 ==> 이때에는 curHigh를 두번째 화학물질의 최고 온도로 바꿔주고,

         냉장고 개수를 하나 증가시킨다.

 

최근에 올라온 글
Total
Today
Yesterday