[SWEA][18662] 등차수열 만들기

Yunho Jung·2023년 11월 13일
0

SWEA

목록 보기
4/5

소스 코드

#include <iostream>
#define endl "\n"

using namespace std;

int a, b, c;
double minimumX;

bool isValid(int a, int b, int c) {
	return b - a == c - b;
}

int getDiff(int b, int a) {
	int diff = b - a;

	return diff;
}

double getAbsDiffDouble(double a, double b) {
	double diff = a - b;
	if (diff < 0) {
		diff *= -1;
	}

	return diff;
}

void solve() {
	cin >> a >> b >> c;
	minimumX = 987654321.0;

	if (isValid(a, b, c)) {
		cout << "0.0" << endl;
		return;
	}

	int compC = b + getDiff(b, a);
	double diff = getAbsDiffDouble((double)compC, (double)c);
	if (diff < minimumX) {
		minimumX = diff;
	}

	double compB = (double)a + (double)getDiff(c, a) / 2;
	diff = getAbsDiffDouble(compB, (double)b);
	if (diff < minimumX) {
		minimumX = diff;
	}

	int compA = b - getDiff(c, b);
	diff = getAbsDiffDouble((double)compA, (double)a);
	if (diff < minimumX) {
		minimumX = diff;
	}

	cout << minimumX << endl;
}

int main() {
	//freopen("sample_input_swea_18662.txt", "r", stdin);

	ios_base::sync_with_stdio(0);
	cin.tie(0);
	
	int TC;
	cin >> TC;

    cout << fixed;
    cout.precision(1);
	for (int tc = 1; tc <= TC; ++tc) {
		cout << "#" << tc << " ";
		solve();
	}

	return 0;
}

해설

a, b, c가 등차수열을 이루게 하는 최소 x 구하기.
이때, 최소 x란 a, b, c 중 하나를 선택하여 실수 x를 더하거나 뺐을 때 a, b, c가 등차수열을 이루게 하는 x를 의미.
절대오차 또는 상대오차가 10의 -9승 이하여야 하므로, 유효숫자가 6인 float는 사용 불가. 따라서 x는 double 자료형(유효숫자 15).

다음 3가지 경우 고려
1. a b c+-x 가 등차수열
2. a b+-x c 가 등차수열
3. a+-x b c 가 등차수열

각 경우마다 x를 구하여 minimumX를 업데이트 하여 최종 minimumX를 출력하는 코드 작성

0개의 댓글