티스토리 뷰
https://www.acmicpc.net/problem/1092
1092번: 배
첫째 줄에 N이 주어진다. N은 50보다 작거나 같은 자연수이다. 둘째 줄에는 각 크레인의 무게 제한이 주어진다. 이 값은 1,000,000보다 작거나 같다. 셋째 줄에는 박스의 수 M이 주어진다. M은 10,000보
www.acmicpc.net
문제 이해
해당 문제는 크레인이 박스를 옮기는데 크레인의 제한에 맞추어 옮기는 문제이다.
해당 문제의 경우 가장 큰 크레인 부터 가장 큰 박스 부터 시작해서 차례로 검색해서 큰 순서대로 먼저 처리하는 방식으로 문제를 해결 한다.
풀이
1. 크레인에 대한 입력
2. 박스에 대한 입력
3. 내림 차순으로 정렬
4. 만약 가장 큰 박스를 가장 큰 크레인이 옮길 수 없다면 -1 출력
5. 아니라면 가장 큰 크레인 부터 시작해서 가장 작은 크레인 까지 반복
6. 현재 크레인이 옮길 수 있는 가장 큰 박스를 선택해 뺀다.
7. 만약 모든 크레인을 사용하면 시간을 더한다.
위의 작업을 반복해 문제를 해결 한다.
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Scanner;
import java.util.concurrent.atomic.AtomicBoolean;
public class test41 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//크레인 입력
int n = sc.nextInt();
ArrayList<Integer> crain = new ArrayList<>();
for (int i = 0; i < n; i++) {
crain.add(sc.nextInt());
}
//박스 입력
int m = sc.nextInt();
ArrayList<Integer> box = new ArrayList<>();
for (int i = 0; i < m; i++) {
box.add(sc.nextInt());
}
//정렬 내림차순으로
Collections.sort(crain,Collections.reverseOrder());
Collections.sort(box,Collections.reverseOrder());
//출력 시간
int time = 0;
//만약 가장 큰 크레인이 가장 큰 박스를 옮길 수 없다면 모든 박스를 옮기지 못함
//즉 -1 주고 끝
if(crain.get(0)<box.get(0)){
System.out.println(-1);
return;
}
//박스가 빌때 까지
//즉 박스 를 다 옮기면 끝
while(!box.isEmpty()) {
//박스의 순서
int index =0;
//크레인의 순서
for(int i=0; i< n; ) {
if(index == box.size()){ //모든 박스를 검색했으면 다음 크레인 선택
break;
}else if(crain.get(i) >= box.get(index)) { //크레인이 박스를 옮길 수 있다면
box.remove(index); //박스를 지우고
i++; //크레인의 위치를 옮김
}else {
index++; //불가능 하면 다음 박스를 검색
}
}
time++; //시간추가
}
System.out.println(time);
}
}