세개의 숫자 순서대로 주어질 때 이 수들이 등차수열을 이루게 하기 위해 실수를 더하거나 뻬려한다. 이 실수의 최솟값을 구하는 문제이다.
두번째 숫자 - 첫번째 숫자 가 세번째 숫자 - 두번째 숫자 와 같다면 공차가 같아 이미 등차수열이므로 더하거나 뺄 필요 없어져 0.0을 출력한다.
int a = Integer.parseInt(st.nextToken()), b = Integer.parseInt(st.nextToken()), c = Integer.parseInt(st.nextToken());
double d1 = (double)(b-a), d2 = (double)(c-a)/2, d3 = (double)(c-b);
if(d1 == d2) {
sb.append("0.0").append('\n');
continue;
}
아니라면 a, b, c 중 하나를 다른 공차에 맞게 교정하는데 드는 최소 실수를 구한다.
double min = Double.MAX_VALUE;
min = Math.min(min, Math.abs(a - (b - d3)));
min = Math.min(min, Math.abs(b - (a + d2)));
min = Math.min(min, Math.abs(c - (a + 2*d1)));
sb.append(min).append('\n');
결과 코드는 다음과 같다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Solution {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine());
StringBuilder sb = new StringBuilder();
for (int tc = 1; tc <= T; tc++) {
sb.append('#').append(tc).append(' ');
StringTokenizer st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken()), b = Integer.parseInt(st.nextToken()), c = Integer.parseInt(st.nextToken());
double d1 = (double)(b-a), d2 = (double)(c-a)/2, d3 = (double)(c-b);
//System.out.println(d1 + " " + d2 + " " + d3);
if(d1 == d2) {
sb.append("0.0").append('\n');
continue;
}
double min = Double.MAX_VALUE;
min = Math.min(min, Math.abs(a - (b - d3)));
min = Math.min(min, Math.abs(b - (a + d2)));
min = Math.min(min, Math.abs(c - (a + 2*d1)));
sb.append(min).append('\n');
}
br.close();
System.out.print(sb);
}
}'알고리즘(백준 등) 공부' 카테고리의 다른 글
| SWEA 5684. [Professional] 운동 (0) | 2026.04.30 |
|---|---|
| SWEA 17937. 큰 수의 최대공약수 (0) | 2026.04.30 |
| SWEA 18799. 평균의 평균 (0) | 2026.04.29 |
| SWEA 19003. 팰린드롬 문제 (0) | 2026.04.28 |
| SWEA 19004. 점프 놀이 (0) | 2026.04.28 |