백준 1092 배 문제풀이 (JAVA)

링크텍스트

문제


지민이는 항구에서 일한다. 그리고 화물을 배에 실어야 한다. 모든 화물은 박스에 안에 넣어져 있다. 항구에는 크레인이 N대 있고, 1분에 박스를 하나씩 배에 실을 수 있다. 모든 크레인은 동시에 움직인다.

각 크레인은 무게 제한이 있다. 이 무게 제한보다 무거운 박스는 크레인으로 움직일 수 없다. 모든 박스를 배로 옮기는데 드는 시간의 최솟값을 구하는 프로그램을 작성하시오.

입력


첫째 줄에 N이 주어진다. N은 50보다 작거나 같은 자연수이다. 둘째 줄에는 각 크레인의 무게 제한이 주어진다. 이 값은 1,000,000보다 작거나 같다. 셋째 줄에는 박스의 수 M이 주어진다. M은 10,000보다 작거나 같은 자연수이다. 넷째 줄에는 각 박스의 무게가 주어진다. 이 값도 1,000,000보다 작거나 같은 자연수이다.

출력


첫째 줄에 모든 박스를 배로 옮기는데 드는 시간의 최솟값을 출력한다. 만약 모든 박스를 배로 옮길 수 없으면 -1을 출력한다.

풀이


소스코드


import java.util.*;
import java.io.*;
public class Main{
    
    public static void main(String [] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringBuilder sb = new StringBuilder();
        StringTokenizer st;// = new StringTokenizer(br.readLine());
        final int NUMBER_OF_CRAIN = Integer.parseInt(br.readLine());
        st =  new StringTokenizer(br.readLine());
        ArrayList <Crain> crain = new ArrayList<Crain>();
        crain.add(new Crain(0));
        for(int i=0;i<NUMBER_OF_CRAIN;i++) {
            crain.add(new Crain(Integer.parseInt(st.nextToken()) ) );
        }
        crain.sort(Comparator.naturalOrder());
        int maxCrainWeight = crain.get(NUMBER_OF_CRAIN).weight;
        int railBox[] = new int [NUMBER_OF_CRAIN + 1];
        for(int i=1;i<=NUMBER_OF_CRAIN;i++) {
            crain.get(i).rail = i;
        }
        int numberOfBox = Integer.parseInt(br.readLine());
        boolean canOperation = true;
        
        
        st = new StringTokenizer(br.readLine());
        for(int i=0;i<numberOfBox;i++) {
            int box = Integer.parseInt(st.nextToken());
            if(maxCrainWeight < box) {
                canOperation = false;
                break;
            }
            for(int j=1;j<=NUMBER_OF_CRAIN;j++) {
                if(box <= crain.get(j).weight) {
                    railBox[j]++;
                    break;
                }
            }
        }
        if(canOperation) {
            int day = 0;
            while(numberOfBox > 0) {
                day++;
                for(int i=NUMBER_OF_CRAIN;i>0;i--) {
                    
                    if(crain.get(i).rail == 0) {
                        continue;
                    }
                    
                    if(railBox[crain.get(i).rail]==0) {
                        int j;
                        for(j=crain.get(i).rail;j>0;j--) {
                            if(railBox[j] != 0) {
                                crain.get(i).rail = j;
                                break;
                            }
                        }
                        if(j==0) {
                            crain.get(i).rail = j;
                            continue;
                        }
                    }
 
                    numberOfBox--;
                    railBox[crain.get(i).rail]--;
                } 
            }
            sb.append(day);
            
        }else {
            sb.append(-1);
        }
        
        sb.append("\n"); 
        
        bw.write(sb.toString());
        
  

        bw.flush();
        br.close();
        bw.close();
        
    }

    
}
class Crain implements Comparable<Crain>{
    int weight;
    int rail;
    
    @Override
    public int compareTo(Crain crain) {
        if(this.weight == crain.weight) return 0;
        else if(this.weight >  crain.weight) return 1;
        else return -1;
    } 

    
    public Crain(){}
    
    public Crain(int weight) {
        this.weight = weight;
    }
    
}

좋은 웹페이지 즐겨찾기