백준 27295번 문제 바로가기

나의 풀이

문제 자체는 그리 어렵지 않다. 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++에서는 정수의 크기도 고려해야한다는 점을 기억하자!!

답이 틀리면 문제를 탓하지 말고, 내 풀이를 탓하자!