프로그래머스 - 다항식 더하기 - C++
https://school.programmers.co.kr/learn/courses/30/lessons/120863#qna
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
#include <string>
#include <vector>
using namespace std;
string solution(string polynomial) {
string answer = "";
int n = 0;
int pos = 0;
int xCnt = 0, nCnt = 0;
while ((n = polynomial.find(' ', pos)) != string::npos)
{
string a = polynomial.substr(pos, n - pos);
if (a[a.length() - 1] == 'x')
{
if (a == "x")
xCnt++;
else
xCnt += stoi(a.substr(0, a.length() - 1));
}
else
nCnt += stoi(a);
n += 3;
pos = n;
}
string a = polynomial.substr(pos);
if (a[a.length() - 1] == 'x')
{
if (a == "x")
xCnt++;
else
xCnt += stoi(a.substr(0, a.length() - 1));
}
else
{
nCnt += stoi(a);
}
if (xCnt >= 1)
{
if(xCnt>1)
answer = to_string(xCnt);
answer += "x";
if(nCnt!=0)
answer += " + ";
}
if (nCnt != 0)
{
answer += to_string(nCnt);
}
return answer;
}
설명
이 문제는 주어진 다항식을 보고 x는 x끼리 상수는 상수끼리 더해서 ax + b 꼴로 바꿔서 반환해주는 문제이다.
따라서 for문을 돌며 공백을 기준으로 항을 구분하고 x가 붙어있나 아니냐에 따라서 계수를 세면 된다.
int n = 0;
int pos = 0;
int xCnt = 0, nCnt = 0;
while ((n = polynomial.find(' ', pos)) != string::npos)
while문을 돌며 공백을 기준으로 항을 나눌 것이다.
string.find 함수로 pos 인덱스부터 ' ' 을 찾고 n에 그 인덱스를 저장한다.
그리고 find함수가 문자열의 끝을 반환했다면 while 문을 종료한다는 뜻이다.
find함수는 ' ' 을 찾지 못했다면 문자열의 끝을 나타내는 string::npos를 반환한다.
{
string a = polynomial.substr(pos, n - pos);
if (a[a.length() - 1] == 'x')
{
if (a == "x")
xCnt++;
else
xCnt += stoi(a.substr(0, a.length() - 1));
}
else
nCnt += stoi(a);
n += 3;
pos = n;
}
while문 내부이다.
' ' 위치를 찾았다면 시작위치인 pos 부터 n-pos 만큼의 길이를 잘라서 새 문자열을 만들고 string변수 a에 저장한다.
ex) "3x + 4" 이라면
pos = 0 부터 find함수를 이용해 ' '를 찾았다면 n 은 2를 가지고 있다.
따라서 3x 라는 항을 구분해내기 위해서는 0부터 2개를 잘라서 문자열을 만들어야 한다.
(substr 함수가 이해가 가지 않는다면 #substr태그로 필자의 다른글의 사용예시를 보거나 구글에 검색해보기 바란다. )
if (a[a.length() - 1] == 'x')
{
if (a == "x")
xCnt++;
else
xCnt += stoi(a.substr(0, a.length() - 1));
}
else
nCnt += stoi(a);
만든 문자열 a의 맨 끝에 x가 붙어있는지에 따라서
xCnt 나 nCnt를 증가시킨다.
(stoi함수는 문자열을 정수형으로 바꿔주는 함수이다. )
n += 3;
pos = n;
마지막으로 n을 3증가시킨다. 항 사이에 " + " 이렇게 공백 2개와 + 문자가 있기 때문이다.
그리고 find 시작위치인 pos도 n으로 바꿔준다.
string a = polynomial.substr(pos);
if (a[a.length() - 1] == 'x')
{
if (a == "x")
xCnt++;
else
xCnt += stoi(a.substr(0, a.length() - 1));
}
else
{
nCnt += stoi(a);
}
while문이 종료되면 마지막 항이 남은 상태이다. 왜냐하면 ' '을 못찾아 while문이 종료되었기 때문이다.
ex) "3x + 4" 이면 4부터 ' ' 이 없어서 while이 종료된다. 4가 남은 상태.
그래서 while문에서와 동일하게 한번 더 항을 판단하는 코드를 작성해준다.
if (xCnt >= 1)
{
if(xCnt>1)
answer = to_string(xCnt);
answer += "x";
if(nCnt!=0)
answer += " + ";
}
마지막으로 xCnt 와 nCnt를 바탕으로 answer문자열을 만드는 과정이다.
x의 계수가 1이상이면 xCnt를 이용해 ax문자열을 만든다. 이 때, xCnt가 1이라면 x로 만든다.
그리고 nCnt가 0이 아니라면 " + " 를 더해주고 아니면 더하지 않는다.
if (nCnt != 0)
{
answer += to_string(nCnt);
}
마찬가지로 nCnt도 0이 아니면 문자열에 추가해준다.