본문 바로가기

백준

백준17214 - 다항 함수의 적분

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

 

17214번: 다항 함수의 적분

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

www.acmicpc.net

다항 함수를 적분하는 문제였다. 경우의 수가 많아서 조금 오래걸린 문제다. 1과 -1의 처리, 0에 입력 여부가 문제를 통과하는데 귀찮게 하는 요소이다.

 

ex1.) -2x+0 -> -xx+W

 

ex2.) -2x -> -xx+W

 

ex3.) -2x-0 -> -xx+W

 

ex4.) 0 -> W

 

ex5.) 1 -> x+W

 

ex6.) -1 -> -x+W

 

ex7.) -4x+1 -> -2xx+x+W

 

ex8.) -6x-1 -> -3xx-x+W

 

#include <iostream>
#include <string>
#include <cmath>
using namespace std;
int main() {
	string s; //수식
	string check; //문자열에 있는 숫자를 각 계수와 상수로 구분하는 변수
	int coef = 0; //계수
	int order = 0; //차수
	int stop = 0; //x가 발견된 곳
	int k = 0; //일차항

	cin >> s;

	//일차식인지 검사하는 곳
	for (unsigned int i = 0; i < s.size(); i++) {
		if (s[i] == 'x') { //x가 있으면
			order = 1; //차수는 1차
			stop = i; //x가 발견된 곳
			break; //탈출
		}
	}

	if (order == 0) { //0차식이면
		coef = stoi(s); //입력한 문자열이 계수가 된다.
		if (coef == 0) { //계수가 0이면 
			cout << "W"; //상수항 출력
		}
		else if (abs(coef) == 1) { //입력한 수의 절댓값이 1이면
			if (coef == 1) { //양수 1이면
				cout << "x+W"; //1을 무시하고 그냥 출력
			}
			else if (coef == -1) { //음수 1이면
				cout << "-x+W"; //1을 무시하고 -기호 붙인채 출력
			}
		}
		else { //입력한 수의 절댓값 1이 아니면
			cout << coef << "x+W"; //계수를 붙인채로 출력
		}
	}
	else if (order == 1) { //일차식이면
		//계수를 구하기 위해 x가 발견된 바로 앞까지 숫자를 얻는다. 
		for (unsigned int i = 0; i < stop; i++) { 
			check = check + s[i];
		}
		coef = stoi(check) / 2; //적분을 하면 일차항의 계수는 절반으로 나뉘어져 이차항의 계수가 된다.
		check.clear(); //상수를 구하기 위해 초기화

		//상수를 구하기 위해 x가 발견된 바로 뒤부터 맨 마지막까지 숫자를 얻는다.
		for (unsigned int i = stop + 1; i < s.size(); i++) {
			check = check + s[i];
		}

		if (check == "") { //아무런 상수항도 입력되지 않았으면
			check = "0"; //check를 0으로 초기화
		}

		k = stoi(check); //문자열로된 일차항을 정수로 바꾼다.

		if (abs(coef) == 1) { //이차항 계수의 절댓값이 1이면
			if (coef == 1) { //양수 1인 경우
				cout << "xx"; //"xx"출력
			}
			else if (coef == -1) { //음수 1인 경우
				cout << "-xx"; //"-xx"출력
			}
		}
		else { //이차항의 절댓값이 1이 아닌 경우
			cout << coef << "xx"; //계수를 붙인 채로 출력
		}

		if (k != 0) { //일차항이 존재하는 경우
			if (abs(k) == 1) { //일차항의 절댓값이 1인경우
				if (k == 1) { //양수 1인 경우
					cout << "+x+W"; //+를 붙인채로 일차항과 상수항을 출력
				}
				else if (k == -1) { //음수 1인 경우
					cout << "-x+W"; //-를 붙인채로 일차항과 상수항을 출력
				}
			}
			else if (k > 0) { //일차항의 절댓값이 1이 아니면서 양수인 경우
				cout << "+" << k << "x+W"; //+기호를 출력하고 일차항의 계수를 출력하고 일차항과 상수항을 출력
			}
			else if (k < 0) { //일차항의 절댓값이 1이 아니면서 음수인 경우
				cout << k << "x+W"; //일차항의 계수를 출력하고 일차항과 상수항을 출력
			}
		}
		else { //일차항이 존재하지 않는 경우
			cout << "+W"; //상수항만 출력
		}
	}
}

'백준' 카테고리의 다른 글

백준1644 - 소수의 연속합  (0) 2019.07.31
백준5566 - 주사위 게임  (0) 2019.07.31
백준4889 - 안정적인 문자열  (0) 2019.07.30
백준1699 - 제곱수의 합  (0) 2019.07.28
백준2606 - 바이러스  (0) 2019.07.28