반응형
https://www.acmicpc.net/problem/1092
[풀이과정]
처음에 복잡도가 N*M인 코드를 작성했는데 틀렸다. 왜 틀렸는지 아직도 잘 모르겠음..
가장 중요했던 건 내림차순으로 정렬하는 것인 것 같다. 가장 큰 수들끼리 비교해서 옮기지 못 하면 -1 반환하고, 아니면 계산했는데,
만약 크레인 무게 제한이 20 10 10일 때, 박스 무게가 20 20 10인 경우를 가정했을 때 20 10 / 20 이렇게 두 번 옮겨져야 한다. 그럼 박스를 가리키는 idx를 어떻게 앞으로 옮길지 엄청 고민했는데, 박스를 삭제하면 되는 일이었다. 옮겨진 박스를 삭제하면서 while문에서 초기화를 0으로 해주면 저절로 남겨진 박스 중 가장 무거운 박스를 가리키게 된다.
[코드]
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
/*
화물을 배에 실어야 한다.
모든 화물은 박스 안에 넣어져 있다.
항구에는 크레인이 N대 있고, 1분에 박스를 하나씩 배에 실을 수 있다.
모든 크레인은 동시에 움직이며 무게 제한이 있다.
무게 제한보다 무거운 박스는 크레인으로 움직일 수 없다.
모든 박스를 배로 옮기는데 드는 시간의 최솟값을 구하라.
*/
public class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static StringTokenizer st;
static int N, M;
static Integer[] craneLimit;
static List<Integer> boxWeight;
public static void main(String[] args) throws IOException{
init();
/*
[출력]
모든 박스를 배로 옮기는데 드는 시간의 최솟값
만약 옮길 수 없으면 -1
*/
//박스 최대 무게가 크레인 최대 무게 제한보다 크면 불가능
if(boxWeight.get(0) > craneLimit[0]){
System.out.println(-1);
return;
}
int result = 0;
while(!boxWeight.isEmpty()){
int boxIdx = 0, craneIdx = 0;
while(craneIdx < N){
if(boxIdx == boxWeight.size()){
break;
}
//박스 무게가 무게 제한보다 작거나 같으면
else if(craneLimit[craneIdx] >= boxWeight.get(boxIdx)){
//삭제
boxWeight.remove(boxIdx);
craneIdx++;
}
else{
boxIdx++;
}
}
result++;
}
System.out.println(result);
}
static void init() throws IOException {
/*
[입력]
1. 크레인 개수 N (N <= 50 인 자연수)
2. 각 크레인의 무게 제한 ( <= 1,000,000)
3. 박스의 수 M (M <= 10,000 인 자연수)
4. 각 박스의 무게 ( <= 1,000,000)
*/
N = Integer.parseInt(br.readLine());
craneLimit = new Integer[N];
st = new StringTokenizer(br.readLine());
for(int n = 0; n < N; n++){
craneLimit[n] = Integer.parseInt(st.nextToken());
}
M = Integer.parseInt(br.readLine());
boxWeight = new ArrayList<>();
st = new StringTokenizer(br.readLine());
for(int m = 0; m < M; m++){
boxWeight.add(Integer.parseInt(st.nextToken()));
}
//내림차순 정렬
Arrays.sort(craneLimit, Collections.reverseOrder());
Collections.sort(boxWeight, Collections.reverseOrder());
}
}
/*
가장 큰 무게 제한보다 가장 무거운 박스의 무게가 크면 -1
크레인의 무게 제한을 큰 순서대로 정렬한 후 박스 무게를 뒤에 넣어줌.
N*M = 500,000
*/
반응형
'백준 > 정렬' 카테고리의 다른 글
[백준] 2751 : 수 정렬하기 2 (0) | 2023.04.07 |
---|---|
[백준] 10867 : 중복 빼고 정렬하기 (0) | 2023.04.07 |