[백준] 1756: 피자 굽기 - JAVA
https://www.acmicpc.net/problem/1756
풀이
구현 + 그리디 문제.
피자 반죽을 오븐의 사이즈에 맞춰서 넣는데
위에서부터 내려가다가 오븐의 사이즈가 피자 사이즈보다 작으면 그 위칸에 위치한다.
예제에서 오븐의 사이즈가 { 5, 6, 4, 3, 6, 2, 3 } 으로 주어졌는데
두번째 칸에는 위에서부터 내려와야 하므로 최대 5 사이즈의 피자가 들어갈 수 있다.
따라서 오븐의 사이즈 배열을 { 5, 5, 4, 3, 3, 2, 2 } 와 같이 바꿔주었다.
단순하게 아래에서부터 탐색하여 위치를 찾는 방법과
이분탐색으로 위치를 찾는 방법이 있었다.
단순 탐색
메모리: 64440KB
시간: 532ms
언어: Java 11
코드
import java.io.*;
import java.util.*;
public class Main {
static int D, N, pos;
static int[] oven;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
D = Integer.parseInt(st.nextToken());
N = Integer.parseInt(st.nextToken());
oven = new int[D + 1];
st = new StringTokenizer(br.readLine());
oven[0] = Integer.MAX_VALUE;
for (int i = 1; i < D + 1; i++) {
oven[i] = Integer.parseInt(st.nextToken());
oven[i] = Math.min(oven[i - 1], oven[i]);
}
st = new StringTokenizer(br.readLine());
pos = D;
for (int i = 0; i < N; i++) {
int size = Integer.parseInt(st.nextToken());
dropPizza(size);
}
System.out.println(pos);
}
private static void dropPizza(int size) {
boolean flag = false;
for (int i = pos; i > 0; i--) {
if (size <= oven[i]) {
pos = i;
oven[i] = 0;
flag = true;
break;
}
}
if (!flag) {
pos = 0;
}
}
}
이분 탐색
메모리: 64200KB
시간: 528ms
언어: Java 11
코드
import java.io.*;
import java.util.*;
public class Main {
static int D, N, pos;
static int[] oven;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
D = Integer.parseInt(st.nextToken());
N = Integer.parseInt(st.nextToken());
oven = new int[D + 1];
st = new StringTokenizer(br.readLine());
oven[0] = Integer.MAX_VALUE;
for (int i = 1; i < D + 1; i++) {
oven[i] = Integer.parseInt(st.nextToken());
oven[i] = Math.min(oven[i - 1], oven[i]);
}
st = new StringTokenizer(br.readLine());
pos = D + 1;
for (int i = 0; i < N; i++) {
int size = Integer.parseInt(st.nextToken());
binaryPizza(size, 0, pos - 1);
}
System.out.println(pos);
}
private static void binaryPizza(int size, int start, int end) {
while (start <= end) {
int mid = (start + end) / 2;
if (size <= oven[mid]) {
start = mid + 1;
pos = mid;
} else {
end = mid - 1;
}
}
}
}