본문 바로가기

알고리즘

[코드업] 5136 - No. X=Y=Z

세 정수 X,Y,Z 를 입력 받아 다음의 연산을 적용하여 X=Y=Z 가 되는 최소 연산의 횟수를 출력하는 프로그램을 작성하시오.

가능한 연산

 X,Y,Z 중에서 2개를 선택하여 1 증가시킨다.

 X,Y,Z 중에서 1개를 선택하여 2 증가시킨다.

입력

첫 줄에 세 정수 X,Y,Z 가 입력된다. (0<=X,Y,Z<=51)

출력

주어진 조건을 만족하는 최소의 연산 횟수를 출력한다.

더보기

입력 예시

2 5 4

출력 예시

2


#include<iostream>
#include<algorithm>
using namespace std;

int evenDif(int X, int Y, int Z) {
	return (Z - X) / 2 + (Z - Y) / 2;
}

int solve(int X, int Y, int Z) {
	if ((Y - X) % 2 != 0 && (Z - Y) % 2 != 0) {
		return 2 + evenDif(X + 1, Y + 2, Z + 1);
	}
	else if ((Y - X) % 2 == 0 && (Z - Y) % 2 != 0) {
		return 1 + evenDif(X + 1, Y + 1, Z);
	}
	else if ((Y - X) % 2 != 0 && (Z - Y) % 2 == 0) {
		return 1 + evenDif(X, Y + 1, Z + 1);
	}
	else {
		return evenDif(X, Y, Z);
	}
}

int main() {
	int X, Y, Z;
	cin >> X >> Y >> Z;
	int sum = X + Y + Z;
	int maxValue = max(X, max(Y, Z));
	int minValue = min(X, min(Y, Z));
	int midValue = sum - maxValue - minValue;
	
	cout << solve(minValue, midValue, maxValue);
	return 0;
}