백준 1092 - 배
Updated:
Java
1092 번 - 배
문제
화물을 배에 실어야 한다. 모든 화물은 박스에 안에 넣어져 있다. 항구에는 크레인이 N대 있고, 1분에 박스를 하나씩 배에 실을 수 있다. 모든 크레인은 동시에 움직인다.
각 크레인은 무게 제한이 있다. 이 무게 제한보다 무거운 박스는 크레인으로 움직일 수 없다. 모든 박스를 배로 옮기는데 드는 시간의 최솟값을 구하는 프로그램을 작성하시오.
접근 방법
코드
import java.util.*;
import java.util.Map.Entry;
import java.io.*;
public class Main {
static int n, m, result;
static Integer[] crane, box;
static boolean[] moved;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer stk;
// 초기화
n = stoi(br.readLine());
crane = new Integer[n];
stk = new StringTokenizer(br.readLine());
for(int i = 0; i < n; i++)
crane[i] = stoi(stk.nextToken());
m = stoi(br.readLine());
box = new Integer[m];
stk = new StringTokenizer(br.readLine());
for(int i = 0; i < m; i++)
box[i] = stoi(stk.nextToken());
moved = new boolean[m];
// 내림차순으로 크레인과 박스를 정렬
Arrays.sort(crane, Collections.reverseOrder());
Arrays.sort(box, Collections.reverseOrder());
// 박스를 못 옮기는 크레인이 존재 할 시
if(box[0] > crane[0]) {
System.out.println(-1);
return;
}
int boxCnt = m, idx = 0;
while(boxCnt != 0) { // 모든 박스를 옮긴다.
idx = 0; // 크레인의 순서
for(int i = 0; i < m; i++) {
if(idx == n) // n개의 크레인이 다 박스를 옮겼을 때
break;
if(!moved[i] && box[i] <= crane[idx]) {
moved[i] = true; // 해당하는 박스는 옮겨졌다고 표시한다.
idx++; // 다음 크레인으로 넘어간다
boxCnt--; // 총 박스 개수를 하나 줄인다
}
}
result++; // n개의 크레인이 한번씩 박스를 옮겼으므로 1분 증가
}
System.out.println(result);
br.close();
}
static int stoi(String str) {
return Integer.parseInt(str);
}
}
총평
난이도
⭐⭐⭐⭐⭐
후기
문제 푸는 시간을 1시간 반 잡을 필요가 있다.
풀다가 도저히 안될거 같으면 새롭게 생각해야한다.