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

프로그래머스 - OX퀴즈 - C++

게임만드는학생 2023. 9. 10. 13:19

https://school.programmers.co.kr/learn/courses/30/lessons/120907

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

#include <string>
#include <vector>

using namespace std;

bool Cal(int n1, int n2, int ans, char op)
{
    switch (op)
    {
    case '+':
        return (n1 + n2 == ans) ? true : false;
    case '-':
        return (n1 - n2 == ans) ? true : false;
    case '*':
        return (n1 - n2 == ans) ? true : false;
    case '/':
        return (n1 - n2 == ans) ? true : false;
    }
}

vector<string> solution(vector<string> quiz) {
    vector<string> answer;

    for (int i = 0; i < quiz.size(); i++)
    {
        int pos = quiz[i].find(' ');
        string num1 = quiz[i].substr(0, pos);

        char op = quiz[i][pos + 1];

        int pos2 = quiz[i].find(' ', pos+3);
        string num2 = quiz[i].substr(pos + 3, pos2-(pos + 3));

        string ans = quiz[i].substr(pos2 + 3);

        int n1 = stoi(num1);
        int n2 = stoi(num2);
        int an = stoi(ans);

        if (Cal(n1, n2, an, op))
            answer.push_back("O");
        else
            answer.push_back("X");
    }

    return answer;
}

 

설명

문자열 벡터를 받아서 각 문자열에 담긴 식이 맞는지 틀린지 여부를 O와 X로 answer에 저장하는 것이다.

string 표준헤더에서 제공하는 string.findstring.substr, stoi 함수들을 이용하면 간단하게 해결할 수 있다.

 

먼저 for문을 돌며 각 문자열을 1개씩 확인한다. 

int pos = quiz[i].find(' ');
        string num1 = quiz[i].substr(0, pos);

첫번째 숫자를 구분하기 위한 코드이다.

string.find함수는 찾을 문자를 매개변수로 넣게 되면 처음부터 시작해서 매개변수로 넣은 문자를 찾고 그 위치를 반환해준다.

그리고 string.substr함수는 어떤 문자열에서 새로운 문자열을 만들어주는 함수이다.

ex) s = "abcde"

즉, string.substr(0,2) 이면  0번인덱스부터 2개의 문자를 새 문자열로 만들어달라는 뜻으로,

"ab" 가 반환된다. 

 

따라서 위 코드는 처음 숫자를 num1에 저장한다. 

 

char op = quiz[i][pos + 1];

pos는 공백을 가리키고 그 다음이 연산자이니 pos+1 번째를 op변수에 저장한다. 

 

int pos2 = quiz[i].find(' ', pos+3);
        string num2 = quiz[i].substr(pos + 3, pos2-(pos + 3));

마찬가지로 pos+3은 두번째 숫자가 시작하는 지점이다. 

따라서 find함수로 pos+3부터 시작해서 ' ' 을 찾아달라고 한다. 

substr의 두번째 인자는 두번째 숫자의 길이를 구하기 위함이다. 

시작점은 pos+3 이고 종료지점은 pos2이기 때문에 거기까지 잘라서 문자열을 만든다. 

 

string ans = quiz[i].substr(pos2 + 3);

마지막에 답부분을 ans문자열에 저장한다. 

 

int n1 = stoi(num1);
int n2 = stoi(num2);
int an = stoi(ans);

stoi함수를 통해 각 문자열을 int형 변수에 저장한다. 

 

bool Cal(int n1, int n2, int ans, char op)
{
    switch (op)
    {
    case '+':
        return (n1 + n2 == ans) ? true : false;
    case '-':
        return (n1 - n2 == ans) ? true : false;
    case '*':
        return (n1 - n2 == ans) ? true : false;
    case '/':
        return (n1 - n2 == ans) ? true : false;
    }
}

Cal 함수를 만들어 식이 맞는지를 확인하고 참, 거짓을 반환해준다. 

 

if (Cal(n1, n2, an, op))
            answer.push_back("O");
else
            answer.push_back("X");

따라서 마지막에 Cal 값에 따라 O, X 를 answer에 삽입해준다.