다항식 항들이 담긴 문자열이 주어졌을 때, 해당 다항식의 도함수(미분값)를 계산하는 것이 이번 글의 목표입니다.
다항식이란?
다항식(Polynomial)은 '많은'을 뜻하는 Poly와 '항'을 의미하는 nomial의 합성어로, 말 그대로 여러 개의 항으로 이루어진 식입니다. 다항식은 변수, 계수, 지수를 포함하며, 변수에 대한 덧셈·뺄셈·곱셈 연산만으로 구성됩니다.
다항식 예시: x2 + x + 1
다항식의 미분 공식
p(x) = mxn 형태의 항을 미분하면 결과는 다음과 같습니다.
m * n * x^(n-1)
예제
입력: str = "2x^3 + 1x^1 + 3x^2"
val = 2
출력: 37
설명: 6x^2 + 1x^0 + 6x^1
x = 2 대입 시
6*4 + 1 + 6*2 = 24 + 1 + 12 = 37
입력: str = "1x^3"
val = 2
출력: 12
설명: 1 * 3 * x^2
x = 2 대입 시
3 * 4 = 12
문제 해결 접근 방법
- 다항식 문자열과 x의 값을 입력받습니다.
- 문자열을 한 글자씩 순회하면서 숫자(계수)와 변수를 구분합니다.
- '+' 기호를 만날 때까지 각 항을 하나씩 읽어가며 처리합니다.
- 각 항에 대해 미분 법칙인 m * n * x^(n-1)을 적용합니다.
- 모든 항의 미분값을 합산한 최종 결과를 반환합니다.
알고리즘
시작
1단계 -> 함수 long long term(string polyterm, long long val)
문자열 coeffStr을 ""로 선언 및 초기화
정수형 i 선언
반복문: i = 0부터 polyterm[i]가 'x'가 아닐 때까지 i++
coeffStr.push_back(polyterm[i]) 호출
coeff = atol(coeffStr.c_str()) 설정
문자열 powStr을 ""로 선언 및 초기화
반복문: i = i + 2부터 i가 polyterm.size()가 아닐 때까지 i++
powStr.push_back(polyterm[i]) 수행
power = atol(powStr.c_str()) 설정
coeff * power * pow(val, power - 1) 반환
2단계 -> 함수 long long value(string& str, int val)
ans = 0으로 설정
istringstream is(str) 생성
문자열 polyterm 선언
while (is >> polyterm) 동안 반복
토큰이 "+"이면 계속 진행(continue)
아니면 ans = (ans + term(polyterm, val)) 누적
ans 반환
3단계 -> main() 함수
str = "2x^3 + 1x^1 + 3x^2"로 선언 및 초기화
val = 2로 선언 및 초기화
value(str, val)의 반환값 출력
종료
C++ 코드 구현
#include <bits/stdc++.h>
using namespace std;
// 각 항의 미분값을 계산하는 함수
long long term(string polyterm, long long val) {
// 계수(coefficient) 추출
string coeffStr = "";
int i;
for (i = 0; polyterm[i] != 'x'; i++)
coeffStr.push_back(polyterm[i]);
long long coeff = atol(coeffStr.c_str());
// 지수(power) 추출
string powStr = "";
for (i = i + 2; i != polyterm.size(); i++)
powStr.push_back(polyterm[i]);
long long power = atol(powStr.c_str());
// ax^n 형태의 항에 대해 a(n-1)x^(n-1) 값 반환
return coeff * power * pow(val, power - 1);
}
// 전체 다항식의 미분값을 계산하는 함수
long long value(string& str, int val) {
long long ans = 0;
// istringstream을 사용해 문자열을 토큰 단위로 입력받음
istringstream is(str);
string polyterm;
while (is >> polyterm) {
// 토큰이 '+'이면 건너뛰고 다음 토큰 처리
if (polyterm == "+")
continue;
// 그렇지 않으면 해당 항의 미분값을 더함
else
ans = (ans + term(polyterm, val));
}
return ans;
}
// 메인 함수
int main() {
string str = "2x^3 + 1x^1 + 3x^2";
int val = 2;
cout << value(str, val);
return 0;
}
실행 결과
37
위 코드는 istringstream을 활용해 다항식 문자열을 공백 단위의 토큰으로 분리한 뒤, '+' 기호는 건너뛰고 각 항마다 계수와 지수를 추출하여 미분 법칙을 적용합니다. 이후 주어진 x 값에 미분된 식을 대입해 최종 결과를 계산합니다. 문자열 파싱과 수학적 규칙을 결합한 이 방식은 다항식 미분 문제를 매우 직관적이고 효율적으로 해결할 수 있게 해줍니다.