알고리즘
백준 20366번 같이 눈사람 만들래? (JAVA)
박카스마시며코딩
2022. 9. 30. 14:51
https://www.acmicpc.net/problem/20366
20366번: 같이 눈사람 만들래?
높이가 (2, 5), (3, 5)로 구성된 눈사람 둘을 만드는 것이 최적의 경우 중 하나이다. |7-8| = 1 다른 경우로는 (2, 9), (5, 5)로 두 눈사람을 만드는 경우가 있다. |11-10| = 1
www.acmicpc.net
저는 투포인트를 통해 문제를 해결하였습니다.
먼저 배열을 정렬해 주었습니다.
먼저 2중 for문을 통해 두개의 지름을 선택하고, 맨앞과 맨끝을 투포인트로 가리키면서 처음에 선택한 두개의 합보다 작다면 시작 포인트를 늘리고 그렇지 않으면 끝 포인트를 줄였습니다.
package BOJ.twopoint;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
import java.util.function.Function;
public class BOJ_20366 {
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
Function<String,Integer> stoi = Integer::parseInt;
int n = stoi.apply(st.nextToken());
st = new StringTokenizer(br.readLine());
int[] input = new int[n];
for(int i = 0 ; i < n ; i++){
input[i] = stoi.apply(st.nextToken());
}
int result = cal(input,n);
System.out.println(result);
}
private static final int INF = 1_000_000_000;
private static int cal(int[] input, int n) {
Arrays.sort(input);
int result = INF;
for(int i = 0 ; i < n ; i++){
for(int j = i + 1 ; j < n ; j++){
int sum1 = input[i] + input[j];
int start = 0;
int end = n-1;
while(start < end){
if(start == i || start == j){
start++;
continue;
}
if(end == i || end == j){
end--;
continue;
}
int sum2 = input[start] + input[end];
result = Math.min(Math.abs(sum2-sum1),result);
if(sum1 > sum2){
start++;
}else if(sum1 < sum2){
end--;
}else{
return 0;
}
}
}
}
return result;
}
}