나의 풀이
문제 자체는 그리 어렵지 않다. x의 합=X
, (b-y)의 합=Y
라고 두면, 결국엔 $ a * X + Y = 0 $ 방정식을 푸는 것에 불과하기 때문이다. for 반복문으로 x와 y값의 합을 구해준 뒤에 조건에 따라 x_sum=0인 경우, 정수꼴, 분수꼴로 나눠주면 된다.
주의할 점은 주어진 정수의 값이 꽤 크기 때문이다. $ -10^{9} <= x,y <= 10^{9} $ 이고 $ 1 <= n <= 10^{5} $ 이므로 곱하다보면 최대 $ 10^{14} $ 가 되어 int 자료형으로는 overflow가 발생할 수 있다. int / long은 4 byte로, -2,147,483,648 ~ 2,147,483,647
범위를 가지기 때문이다. 따라서 p와 q, divider의 경우 long long 정수 자료형을 사용해서 overflow가 발생하지 않도록 방지해야 한다.
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
int main()
{
int a, x, b, y, n;
long long p, q;
cin >> n >> b;
p=0;
q=0;
for (int i=0; i<n; i++){
x=0; y=0;
cin >> x >> y;
p += y - b;
q += x;
}
// a*q = p
if (q == 0){
cout << "EZPZ";
} else if (p%q == 0){ // 정수꼴
cout << p/q;
} else{ // 분수꼴
long long divider = __gcd(p, q);
divider = abs(divider);
if (q < 0){
q *= -1;
p *= -1;
}
cout << p/divider << "/" << q/divider;
}
return 0;
}
오늘의 교훈
처절하게 틀렸던 나의 기록…
처음에 이 문제를 풀었을 때에는 ‘내 논리가 다 맞는거 같은데 왜 틀리지?!’라며 문제에게 짜증냈다. 채점 답이 이상한건지 의심하기도 했지만, 결국 알게 된건 int으로 변수를 지정해서 overflow가 일어났다는 점… Python에 익숙한 나머지 버릇처럼 int을 사용해왔는데 C++에서는 정수의 크기도 고려해야한다는 점을 기억하자!!
답이 틀리면 문제를 탓하지 말고, 내 풀이를 탓하자! |