[백준 알고리즘] 17214번: 다항 함수의 적분

17214번: 다항 함수의 적분

문제
다항식(polynomial)은 문자의 거듭제곱의 상수 배들의 합을 표현하는 수식이다. 예를 들어 x2+2x+3 같은 식을 의미한다. 그중 변수가 하나인 것을 일변수 다항식이라고 하고 이는 다음과 같이 표현한다.

f(x) = axn + bxn-1+...+cx+d

최대 일차 일변수 다항식이 주어졌을 때 그 함수를 적분한 결과를 출력하는 프로그램을 작성하시오.

입력
첫째 줄에 최대 일차 일변수 다항식이 주어진다. 항의 개수는 최대 2개이고, 변수는 항상 x로 주어지며, 각 항은 공백 문자로 구분되지 않는다. 주어지는 계수는 절댓값이 10,000을 넘지 않는 0이 아닌 2의 배수이고 주어지는 상수는 절댓값이 10,000을 넘지 않는 정수이다. 차수가 같은 항은 한 번만 주어진다. 단, 계수의 절댓값이 1인 경우에는 1을 생략한다. 다항식은 차수가 큰 것부터 작아지는 순서대로 주어진다.

출력
주어진 일변수 다항식을 적분한 결과를 입력 형식과 동일하게 출력한다. 적분상수는 "W"로 x2은 "xx"로 표현한다.

접근 방법:

하 진짜 개빡치는 문제…어렵진 않은데 처리해줘야되는게 너무 많다..문자열을 가운데 있는 연산자를 기준으로 두개로 나누어서 각각 적분식에 따라 처리해주고 마지막에 적분상수 W를 붙여주어 해결했다.

통과 코드:

#include <iostream>
#include <string>
#include <vector>

using namespace std;

int main (){
    string poly;
    cin >> poly;
    vector<string> tokens;


    while(!poly.empty()){
        int end;
        string token;
        for (end = 1 ; end < poly.size() ; end++){
            if (poly[end] == '-' || poly[end] == '+') break;
        }
        token = poly.substr(0, end);

        tokens.push_back(token);
        poly.erase(0, end);
    }

    string result;
    string op = "";
    for (auto s : tokens){
        //cout << s << endl;
        if (stoi(s) == 0) {
            if (s.size() == 2) op.push_back(s[0]);
            break;
        }
        string num;
        size_t p = s.find("x");
        if (p != string::npos) {
            num = s.substr(0, p);
            int n = stoi(num)/2;

            if (abs(n) != 1)result += to_string(n);
            else if (n < 0) result += "-";
            result += "xx";
        }
        else{
            num = s;
            if (num.compare("+1") && num.compare("-1")) result += (num+"x+");
            else {
                result.push_back(num[0]);
                result += "x+";
            }
        }
    }

    if (result.back() != '+' && result.size() > 1) result += "+";
    if (!op.empty()) {
        result.pop_back();
        result += (op + "W");
    }
    else result += "W";
    cout << result << endl;
}

Written by@전여훈 (Click Me!)
고민이 담긴 코드를 만들자, 고민하기 위해 공부하자.