N(1 ≤ N ≤ 100000)개의 얼음 양동이들이 xi(0 ≤ xi ≤ 1,000,000)좌표마다 놓여 있고 1 ≤ K ≤ 2,000,000 이므로 슬윈을 할 때 k의 최대를 조건을 걸어주어야 한다.
구간이 (2*k)-1이면 4,000,000인데 좌표는 1,000,000이 최대이기 때문이다!!
구현은 쉽지만 테스트 케이스에서 거르지 못해서 간과했다.
테스트 케이스가 다 통과인데, 배열 인덱스 오류가 난다면 입력값을 의심해보자.
4Byte * 1,000,000 = 4,000,000Byte = 4,000 KB = 4MB이다.
메모리 용량이 충분하기 때문에 40000001칸 배열을 만들어서 얼음 양을 저장해도 된다!
그리고 이 문제는 정.말. 배열의 범위에 정신 똑바로 차리고 풀어야 한다.
x는 0부터 시작이고 n은 또 1부터 시작임 -,-
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int[] bear;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int k = Integer.parseInt(st.nextToken());
int ice, bucket = 0;
bear = new int[4000001];
for (int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine());
ice = Integer.parseInt(st.nextToken());
bucket = Integer.parseInt(st.nextToken());
bear[bucket] = ice;
}
long sum = 0, result = 0;
for (int i = 0; i < (k * 2) + 1; i++) {
sum += bear[i];
}
result = Math.max(sum, result);
for (int i = (k * 2) + 1; i < bear.length; i++) {
int j = i - ((k * 2) + 1);
sum -= bear[j];
sum += bear[i];
result = Math.max(sum, result);
}
System.out.println(result);
}
}
다른 문제보다 더 많이 틀렸다.
배열의 구간을 확실하게 생각하고 한 번에 코드를 짜는 습관.. 필요해;..