백준 문제 풀이/백준 (JAVA)
JAVA 백준 1092 배 (그리디, 정렬) - 미완
gamja00
2024. 7. 8. 18:34
https://www.acmicpc.net/problem/1092
문제
- 첫째 줄에 N( 1 <= N <= 50 ) 입력.
- 둘째 줄에 크레인 N개의 무게 제한 (1 <= 무게 제한 <= 1000000) 을 순서대로 입력.
- 셋째 줄에 M( 1 <= M <= 10000 )
- 넷째 줄에 박스 M개의 무게 (1 <= 무게 <= 1000000) 를 순서대로 입력.
- 크레인 N개가 1분에 박스를 하나씩 옮길 수 있고 동시에 움직일 때 모든 박스를 배로 옮기는 데 드는 시간의 최솟값 출력.
초기 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int time = 0, count = 0;
int N = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine());
int[] crane = new int[N];
for (int i = 0; i < N; i++) {
crane[i] = Integer.parseInt(st.nextToken());
}
int M = Integer.parseInt(br.readLine());
st = new StringTokenizer(br.readLine());
br.close();
ArrayList<Integer> box = new ArrayList<>();
for (int i = 0; i < M; i++) {
box.add(Integer.parseInt(st.nextToken()));
}
Arrays.sort(crane);
Collections.sort(box);
if (crane[N - 1] < box.getLast()) {
System.out.println("-1");
} else {
while (!box.isEmpty()) {
time++;
if (crane[0] >= box.getFirst()) {
box.removeFirst();
count++;
}
if (!box.isEmpty() && crane[N - 1] >= box.getLast()) {
box.removeLast();
count++;
}
if (N > 2) {
for (int i = N - 2; i > 0; i--) {
for (int j = M - count; j >= 0; j--) {
if (!box.isEmpty() && crane[i] >= box.getLast()) {
box.removeLast();
count++;
break;
}
}
}
}
}
}
System.out.println(time);
}
}
자바 11에서는 getLast랑 getFirst 같은 메소드가 없어서 컴파일 에러가 났다.
수정 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int time = 0, count = 0;
int N = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine());
int[] crane = new int[N];
for (int i = 0; i < N; i++) {
crane[i] = Integer.parseInt(st.nextToken());
}
int M = Integer.parseInt(br.readLine());
st = new StringTokenizer(br.readLine());
br.close();
ArrayList<Integer> box = new ArrayList<>();
for (int i = 0; i < M; i++) {
box.add(Integer.parseInt(st.nextToken()));
}
Arrays.sort(crane);
Collections.sort(box);
if (crane[N - 1] < box.get(box.size()-1)) {
System.out.println("-1");
} else {
while (!box.isEmpty()) {
time++;
if (crane[0] >= box.get(0)) {
box.remove(0);
count++;
}
if (!box.isEmpty() && crane[N - 1] >= box.get(box.size()-1)) {
box.remove(box.size()-1);
count++;
}
if (N > 2) {
for (int i = N - 2; i > 0; i--) {
for (int j = M - count; j >= 0; j--) {
if (!box.isEmpty() && crane[i] >= box.get(box.size()-1)) {
box.remove(box.size()-1);
count++;
break;
}
}
}
}
}
}
System.out.println(time);
}
}
예제는 다 맞았는데 틀렸다고 나와서 다시 수정해야 됨...
근데 뭐가 틀렸는지 모르겠습니다
https://www.acmicpc.net/board/view/122007
어떤 분이 테스트 케이스 모아놓으셨네요 감사합니다...
테스트 케이스도 모두 맞은 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int time = 0, count = 0, first=0;
int N = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine());
int[] crane = new int[N];
for (int i = 0; i < N; i++) {
crane[i] = Integer.parseInt(st.nextToken());
}
int M = Integer.parseInt(br.readLine());
st = new StringTokenizer(br.readLine());
br.close();
ArrayList<Integer> box = new ArrayList<>();
for (int i = 0; i < M; i++) {
box.add(Integer.parseInt(st.nextToken()));
}
Arrays.sort(crane);
Collections.sort(box);
if (crane[0] < box.get(0)) {
for (int i = 1; i < N; i++) {
if(crane[i] >= box.get(0)){
first = i;
break;
}
}
}
if (crane[N - 1] < box.get(box.size() - 1)) {
System.out.println("-1");
} else {
while (!box.isEmpty()) {
time++;
if (crane[first] >= box.get(0)) {
box.remove(0);
count++;
}
if (!box.isEmpty() && crane[N - 1] >= box.get(box.size() - 1)) {
box.remove(box.size() - 1);
count++;
}
if (N > 2) {
for (int i = N - 2; i > first; i--) {
for (int j = M - count; j > 0; j--) {
if (!box.isEmpty() && crane[i] >= box.get(j-1)) {
box.remove(j-1);
count++;
break;
}
}
}
}
}
}
if (count != 0) {
System.out.println(time);
}
}
}
더 이상 고칠 부분도 모르겠고 시간초과 나는 건 아는데 그것도 못 보니 일단 이대로 놔두겠습니다