Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 자바
- 백트래킹
- OS
- 코틀린
- 스프링
- back-end
- 운영체제
- 알고리즘
- Java8
- 모던자바
- lambda
- 그래프
- 백준
- 자료구조
- TDD
- java
- 프로그래머스
- DP
- LEVEL2
- 네트워크
- DFS
- Spring
- programmers
- baekjoon
- BFS
- 프로젝트
- kotlin
- algorithm
- Brute-force
- backtracking
Archives
- Today
- Total
요깨비's LAB
[백준, Brute-Force, Java] P.2470 두 용액 본문
엄청 틀렸고, 결국 다른분들의 설명을 참조하여 풀었습니다. 이 과정에서 해결한 부분들입니다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
static int N;
public static void main(String[] args) {
YoggaebReader input = new YoggaebReader();
StringBuilder sb = new StringBuilder();
N = input.nextInt();
int[] arr = new int[N];
for (int i = 0; i < N; i++) {
arr[i] = input.nextInt();
}
Arrays.sort(arr);
int min = Integer.MAX_VALUE;
int v1 = 0, v2 = 0;
// i<N이 아닌 i < N-1인 이유는 왼쪽을 뽑았을 때 오른쪽값은 왼쪽 + 1부터 시작함
// 하지만 왼쪽값이 N-1일 때 binarysearch를 하면 그대로 N-1반환하므로
// arr[N-1], arr[N-1]의 잘못된 값 반환
for (int i = 0; i < N - 1; i++) {
int idx = binarySearchLowerBound(i + 1, N - 1, arr, -arr[i]);
int abs1 = Math.abs(arr[i] + arr[idx - 1]);
int abs2 = Math.abs(arr[i] + arr[idx]);
if (i < idx - 1 && abs1 < min) {
// System.out.println("##### ABS1 #####");
min = abs1;
v1 = arr[i];
v2 = arr[idx - 1];
// System.out.println(v1 + ", " + v2);
}
if(idx < N && abs2 < min) {
// System.out.println("##### ABS2 #####");
min = abs2;
v1 = arr[i];
v2 = arr[idx];
// System.out.println(v1 + ", " + v2);
}
}
sb.append(v1).append(" ").append(v2);
System.out.println(sb.toString());
}
public static int binarySearchLowerBound(int left, int right, int[] arr, int target) {
int result = right;
while (left <= right) {
int mid = (left + right) / 2;
if (arr[mid] >= target) {
result = mid;
right = mid - 1;
} else {
left = mid + 1;
}
}
return result;
}
static class YoggaebReader {
BufferedReader br;
StringTokenizer st;
public YoggaebReader() {
br = new BufferedReader(new InputStreamReader(System.in));
}
String next() {
while (st == null || !st.hasMoreElements()) {
try {
st = new StringTokenizer(br.readLine());
} catch (IOException e) {
e.printStackTrace();
}
}
return st.nextToken();
}
int nextInt() {
return Integer.parseInt(next());
}
long nextLong() {
return Long.parseLong(next());
}
double nextDouble() {
return Double.parseDouble(next());
}
String nextLine() {
String str = "";
try {
str = br.readLine();
} catch (IOException e) {
e.printStackTrace();
}
return str;
}
}
}
투포인터로 풀수 있다는데 다음 포스트에서는 투포인터로 한번 풀어봐야겠습니다.
'알고리즘(Java) > Brute-Force' 카테고리의 다른 글
[백준, Brute-Force, Java] P.7795 먹을 것인가 먹힐 것인가 (0) | 2021.10.02 |
---|---|
[백준, Brute-Force, Java] P.9663 n-queen (0) | 2021.09.30 |
[백준, Brute-Force, Java] P.1182 부분수열의 합 (0) | 2021.09.30 |
Comments