문제
지민이는 항구에서 일한다. 그리고 화물을 배에 실어야 한다. 모든 화물은 박스에 안에 넣어져 있다. 항구에는 크레인이 N대 있고, 1분에 박스를 하나씩 배에 실을 수 있다. 모든 크레인은 동시에 움직인다.
각 크레인은 무게 제한이 있다. 이 무게 제한보다 무거운 박스는 크레인으로 움직일 수 없다. 모든 박스를 배로 옮기는데 드는 시간의 최솟값을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N이 주어진다. N은 50보다 작거나 같은 자연수이다. 둘째 줄에는 각 크레인의 무게 제한이 주어진다. 이 값은 1,000,000보다 작거나 같다. 셋째 줄에는 박스의 수 M이 주어진다. M은 10,000보다 작거나 같은 자연수이다. 넷째 줄에는 각 박스의 무게가 주어진다. 이 값도 1,000,000보다 작거나 같은 자연수이다.
출력
첫째 줄에 모든 박스를 배로 옮기는데 드는 시간의 최솟값을 출력한다. 만약 모든 박스를 배로 옮길 수 없으면 -1을 출력한다.
풀이
크레인과 박스를 ArrayList
로 입력받아 둘 다 내림차순 정렬을 해준다.
- crane[0] == box[0] -> print -1
- crane > box -> remove box, crane index++
- crane < box -> box index++
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.io.BufferedReader; | |
import java.io.IOException; | |
import java.io.InputStreamReader; | |
import java.util.ArrayList; | |
import java.util.Arrays; | |
import java.util.StringTokenizer; | |
// 배 | |
public class Main { | |
static int n, m; | |
static ArrayList<Integer> cranes = new ArrayList<>(); | |
static ArrayList<Integer> boxes = new ArrayList<>(); | |
static void input() throws IOException { | |
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); | |
n = Integer.parseInt(br.readLine()); | |
StringTokenizer st = new StringTokenizer(br.readLine()); | |
while (st.hasMoreTokens()) | |
cranes.add(Integer.parseInt(st.nextToken())); | |
m = Integer.parseInt(br.readLine()); | |
st = new StringTokenizer(br.readLine()); | |
while (st.hasMoreTokens()) | |
boxes.add(Integer.parseInt(st.nextToken())); | |
} | |
static void greedy() { | |
cranes.sort((o1, o2) -> o2 - o1); | |
boxes.sort((o1, o2) -> o2 - o1); | |
if (cranes.get(0) < boxes.get(0)) { | |
System.out.println(-1); | |
return; | |
} | |
int minute = 0; | |
while (!boxes.isEmpty()) { | |
int idx = 0; | |
for (int i = 0; i < n; ) { | |
if (idx == boxes.size()) { | |
break; | |
} else if (cranes.get(i) >= boxes.get(idx)) { | |
boxes.remove(idx); | |
i++; | |
} else { | |
idx++; | |
} | |
} | |
minute++; | |
} | |
System.out.println(minute); | |
} | |
public static void main(String[] args) throws IOException { | |
input(); | |
greedy(); | |
} | |
} |
'Algorithm > Beakjoon' 카테고리의 다른 글
[백준] 동적계획법 - 1463번: 1로 만들기 (Java) (0) | 2021.07.12 |
---|---|
[백준] 투포인터 - 1644번: 소수의 연속합 (Java) (0) | 2021.07.12 |
[백준] DFS와 BFS - 1707번 : 이분 그래프 (자바) (0) | 2021.07.07 |
[백준] 이분탐색 - 2343번: 기타레슨 (Java) (0) | 2021.06.15 |
[백준] 이분탐색 - 2805번 : 나무 자르기 (Java) (0) | 2021.06.10 |
댓글