본문 바로가기
알고리즘/백준 문제풀이

백준 [java 자바] 1092 : 배

by 잔디🌿 2023. 7. 18.

    https://www.acmicpc.net/problem/1092

     

    1092번: 배

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

    www.acmicpc.net

    배들이 한번에 적재 할 수 있는 최대 무게가 나와있는 상태에서, 주어진 상자를 옮길 수 있는 시간의 최솟값을 구하는 문제이다. 

     나는 현재 남은 화물들을 차례대로 배에 실으면서 시간을 재는 방법을 선택했다.

     

    처음에는 우선순위큐를 사용하려고 했으나, 최대무게를 저장해놓은 배열과 비교하는 과정에서 훨씬 복잡해질 것 같아서 linkedlist를 사용했다. 

    그리고 시간을 최소화 하기 위해서 현재까지 흘러간 시간을 변수로 놓고 쟀고, 배열을 정렬하여 제한값이 큰 배부터 탐색하며 만약 더이상 실을 수 있는 상자가 없는 것을 때에는 그냥 break를 하였다.(뒤에 있는 배들은 실을 수 있는 무게가 더 적으므로 볼 필요가 없기 때문) ( 이부분을 하지 않아서 시간초과가 났었다.) 또한 화물도 정렬을 해서 최대한 큰 화물부터 옮기도록 하였다.

     

    느낀점 : 앞으로 시간초과가 났을 때 시간복잡도 계산할 때를 생각하면서 어디서 시간이 많이 걸리는지 찾아야겠다.

     

    풀이코드

    import java.util.*;
    import java.io.*;
    import java.math.*;
    
    
    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());
    
            StringTokenizer st = new StringTokenizer(br.readLine());
    
            int[] arr = new int[n];
    
            for(int i = 0;i<n;i++){
                arr[i] = Integer.parseInt(st.nextToken());
            }
    
            Arrays.sort(arr);
    
            int m = Integer.parseInt(br.readLine());
            st = new StringTokenizer(br.readLine());
    
    
    
           LinkedList<Integer> list = new LinkedList<>();
    
            for(int i = 0;i<m;i++){
               int k =Integer.parseInt(st.nextToken());
               if(k > arr[n-1]){
                   System.out.println(-1);
                   System.exit(0);
               }
               list.add(k);
            }
    
            Collections.sort(list);
    
    
    
            int ans = 0;
    
            while(list.size() != 0){
                ans++;
    
                for(int i = n-1;i>=0;i--){
                    int now = arr[i];
    
                    if(now < list.get(0)) break;
    
                    for(int j = list.size()-1;j>=0;j--){
                        if(list.get(j) <= now){
                            list.remove(j);
                            break;
                        }
                    }
    
                    if(list.size() == 0) break;
    
                }
            }
    
            System.out.println(ans);
    
    
    
    
        }
    }