지식보부상님의 공부 일지

SWEA 18662번: 등차수열 만들기 (D3) 본문

C언어 문제풀이

SWEA 18662번: 등차수열 만들기 (D3)

지식보부상님 2023. 11. 11. 15:39
세 개의 실수 x,y,z가 등차수열을 이룬다는 것은, y - x = z - y라는 것과 동치이다.
세 정수 a,b,c가 주어진다. 당신은 음이 아닌 실수 x을 정한 뒤, 세 정수 중 하나에서 x만큼을 더하거나 뺄 수 있다. 당신은 이러한 작업을 정확히 한 번 하여 a,b,c가 등차수열을 이루도록 하려고 한다. 
이것이 가능하도록 하는 가장 작은 x의 값이 얼마인지 구하는 프로그램을 작성하라.


[입력]

첫 번째 줄에 테스트 케이스의 수 T가 주어진다.
각 테스트 케이스는 하나의 줄로 이루어진다. 각 줄에는 세 개의 정수 a,b,c (0≤a,b,c≤1000)가 공백 하나를 사이로 두고 주어진다.

[출력]

각 테스트 케이스마다 한 줄에 하나씩, a,b,c가 등차수열을 이루도록 할 수 있는 가장 작은 x의 값을 출력한다. 참값과의 절대 오차 또는 상대 오차가 10-9이하이면 정답 처리된다.
x의 값이 정수가 아닐 수 있음에 유의하라. (x값은 소수점 1자리까지 출력한다.)
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define compare(x, y, z)(x<y?x<z?x:z:y<z?y:z)

int main() {
	int tc, a, b, c;
	int i;
	double a_0, b_0, c_0, x_a, x_b, x_c, min;

	scanf("%d", &tc);
	for (i = 0; i < tc; i++) {
		scanf("%d %d %d", &a, &b, &c);
		//new a, c, b value respectively
		a_0 = 2.0 * b - c;
		c_0 = 2.0 * b - a;
		b_0 = (a + c) / 2.0;
		
		x_a = fabs(a - a_0);
		x_b = fabs(b - b_0);
		x_c = fabs(c - c_0);

		min = compare(x_a, x_b, x_c);
		printf("#%d %.1f\n", i+1, min);
	}
	return 0;
}

채점결과