You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
두 수를 골랐을 때(같은 수일 수도 있다), 그 차이가 M 이상이면서 제일 작은 경우 (0 ≤ M ≤ 20억)
아이디어
배열 A에서 두 수를 골라서 차이가 M 이상인 경우를 찾기 위해 먼저 모든 경우의 수를 생각해 봤다.
배열 A를 오름차순 정렬 후 이중 for문으로 모든 차이를 구해서 가장 작은 차이를 갱신하면 답을 구할 수 있다.
for (inti = 1; i <= N; i++) {
for (intj = i; j <= N; j++) {
if (A[j] - A[i] >= M) {
ans = Math.min(ans, A[j] - A[i]);
break;
}
}
}
이렇게 하면 풀리기는 풀리지만 시간이 오래 걸린다.
더 빠르게 풀기 위해 A 배열을 오름차순으로 정렬한 후 Left와 Right 투 포인터를 활용하여 A[Right]와 A[Left]의 차이 비교해준다.
차이가 M보다 작으면 고려할 대상이 아니므로 R++로 넘어간다.
차이가 M이상인 경우 ans를 갱신해준 후 L++로 다음 경우로 넘어간다.
for (intL = 1; L <= N; L++) {
// 필요한 만큼 R 이동while (R + 1 <= N) {
// M 이하인 경우는 R을 이동시켜서 건너뛰기if (A[R] - A[L] < M) {
R++;
// M 이상일 경우 정답갱신하러 ㄱㄱ
} else {
break;
}
}
// 정답 갱신// 현재 R 포인터의 뒤쪽은 어짜피 차이가 커질테니 상관 Xif (A[R] - A[L] >= M) {
ans = Math.min(ans, A[R] - A[L]);
}
}
이렇게 하면 훨씬 빠른 속도로 더 적은 경우의 수만 고려해서 풀 수 있다.
구현
importjava.io.*;
importjava.util.Arrays;
importjava.util.StringTokenizer;
publicclassMain {
staticBufferedWriterbw = newBufferedWriter(newOutputStreamWriter(System.out));
staticintN, M, ans;
staticint[] A;
staticvoidinit() throwsIOException {
BufferedReaderbr = newBufferedReader(newInputStreamReader(System.in));
StringTokenizerst = newStringTokenizer(br.readLine(), " ");
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
A = newint[N + 1];
for (inti = 1; i <= N; i++) {
A[i] = Integer.parseInt(br.readLine());
}
}
staticvoidpro() throwsIOException {
Arrays.sort(A, 1, N+1);
ans = Integer.MAX_VALUE;
intR = 1;
for (intL = 1; L <= N; L++) {
// 필요한 만큼 R 이동while (R + 1 <= N) {
// M 이하인 경우는 R을 이동시켜서 건너뛰기if (A[R] - A[L] < M) {
R++;
// M 이상일 경우 정답갱신하러 ㄱㄱ
} else {
break;
}
}
// 정답 갱신// 현재 R 포인터의 뒤쪽은 어짜피 차이가 커질테니 상관 Xif (A[R] - A[L] >= M) {
ans = Math.min(ans, A[R] - A[L]);
}
}
bw.write(ans+" ");
}
publicstaticvoidmain(String[] args) throwsIOException {
init();
pro();
bw.close();
}
}
``
---
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
-
문제 : https://www.acmicpc.net/problem/2230
난이도 : 골드 5
아이디어
배열 A에서 두 수를 골라서 차이가 M 이상인 경우를 찾기 위해 먼저 모든 경우의 수를 생각해 봤다.
배열 A를 오름차순 정렬 후 이중 for문으로 모든 차이를 구해서 가장 작은 차이를 갱신하면 답을 구할 수 있다.
이렇게 하면 풀리기는 풀리지만 시간이 오래 걸린다.
더 빠르게 풀기 위해 A 배열을 오름차순으로 정렬한 후 Left와 Right 투 포인터를 활용하여 A[Right]와 A[Left]의 차이 비교해준다.
이렇게 하면 훨씬 빠른 속도로 더 적은 경우의 수만 고려해서 풀 수 있다.
구현
Beta Was this translation helpful? Give feedback.
All reactions