알고리즘/프로그래머스 1단계

프로그래머스 - 다항식 더하기 - C++

게임만드는학생 2023. 9. 19. 14:48

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이 아니면 문자열에 추가해준다.