티스토리 뷰

#include <stdio.h>
#define ll long long
ll U(ll a, ll b) {
	ll r = a%b;
	return (r) ? U(b, r) : b;
}

int main(void) {
	ll n, b, X=0, Y=0, sign = -1;
	scanf("%lld %lld",&n, &b);
	
	for(int i=0; i<n; i++) {
		ll x, y;
		scanf("%lld %lld", &x, &y);
		X += x;
		Y -= y;
	}
	
	Y += n * b;
	
	if(X < 0) {
		sign *= -1;
		X *= -1;
	}
	if(Y < 0) {
		sign *= -1;
		Y *= -1;
	}
	
	//Y/X
	if(X == 0) printf("EZPZ");
	else if(Y%X == 0) {
		printf("%lld", (Y/X) * sign);
	} else {
		ll tmp = U(X, Y);
		X /= tmp;
		Y /= tmp;
		printf("%lld/%lld", sign*Y, X);
	}
}

 

풀이 : 최대공약수를 이용합니다.

 

 

문제는 a를 구해야 하므로

 

X에 x좌표의 값들을 다 더해놓고

Y에 y좌표의 값들을 다 더해놓고 여기에 n * b 도 더해줍니다.

이렇게 되면 aX = -Y    =>    a = -Y/X 입니다.

 

여기서 계산을 용이하기 위해 부호가 양인지 음인지를 나타내는 변수 하나를 만든다음

sign = -1 을 기본으로 해줍니다 여기서 -1을 기본으로 하는 이유는 a = -Y/X 에서 -을 sign에 넣어준 것 입니다.

Y / X 계산에서 X, Y 둘 다 양수이어야 계산이 용이하므로, 음수인 경우 양수로 바꾸어 줍니다. 물론 sign의 값도 변경해주어야 합니다 (양이면 음으로, 음이면 양으로)

 

마지막으로

Y/X 을 출력해야 합니다.

 

1. X가 0인 경우 a는 무한개 입니다. 고로 EZPZ을 출력합니다.

2. Y % X == 0 인 경우 a가 정수란 의미입니다 (Y/X) * sign 을 곱한 것을 출력하면 됩니다.

3. Y % X != 0 인 경우 a가 분수란 의미입니다. 기약분수 형태로 출력하기 위해서, 먼저 X, Y의 최대공약수를 구한 다음,

sign * Y 과 X 을 출력해줍니다. (각각 분자 분수)

 

https://www.acmicpc.net/problem/27295

 

27295번: 선형 회귀는 너무 쉬워 1

유림이는 선형 회귀에 자신이 있다. 그래서 MatKor 동아리에서 선형 회귀에 관한 수업을 할 때 집중을 하지 않았다. 당시 강사였던 동우는 이를 못마땅하게 여겨 유림이에게 더 어려운 문제를 내

www.acmicpc.net

 

최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함