알고리즘/백준 문제풀이
백준 [java 자바] 1092 : 배
잔디🌿
2023. 7. 18. 03:27
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);
}
}