Lv 0. OX퀴즈

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

 

stringstream을 사용한 풀이를 작성해보고 싶어서 아래와 같이 만들어보았다. 

stringstream을 사용하지 않고 주어지는 quiz의 각 원소의 규칙을 파악해서 거기에 맞는 코드를 작성해도 충분히 좋은 코드를 작성해서 제출할 수 있을것 같다. 

#include <string>
#include <vector>
#include <sstream>
#include <iostream>

using namespace std;

vector<string> solution(vector<string> quiz) {
    vector<string> answer;
    for(auto s: quiz){
        stringstream ss;
        ss.str(s);
        int num1=0;
        int num2=0;
        char op;
        char equal;
        int num3=0;
        ss>>num1>>op>>num2>>equal>>num3;
        if(op=='+'){
            if(num1+num2==num3) answer.emplace_back("O");
            else answer.emplace_back("X");
        }
        else{
            if(num1-num2==num3) answer.emplace_back("O");
            else answer.emplace_back("X");
        }
    }
    return answer;
}

이때에 return answer을 반복문 내부에 작성했다가 반복문이 돌지 않고 그대로 return 하면서 처음 원소에 대해서만 동작해서 이유를 제대로 파악하지 못해서 gpt를 통해서 원인을 분석하고 return answer의 위치를 반복문 외부로 옮겨서 문제를 해결하였다. 

반복문 내부에서 return을 하는 경우 원하는 형태의 코드가 맞는지 제대로 확인하도록 하자. 

 

다른 사람의 풀이를 확인해보니, stringsteam을 사용하는 풀이인데, 외부에 bool 판단 함수를 따로 선언해서 해당 함수를 solution 함수에서 불러오는 형태로 코드를 작성한 풀이가 있어서 첨부해본다. 

이런 식으로 작성하는 것 또한 매우 깔끔하게 느껴지고 좋은것 같다. 

 

#include <string>
#include <vector>
#include <sstream>
using namespace std;

bool test(const string& s)
{
    int a;
    int b;
    int c;
    char op;
    char eq;

    stringstream ss;
    ss.str(s);
    ss>>a>>op>>b>>eq>>c;

    if(op == '+')
    {
        return a + b == c;
    }
    else if(op == '-')
    {
        return a - b == c;
    }
}
vector<string> solution(vector<string> quiz) {
    vector<string> answer;

    for(const auto v : quiz)
    {
        if(test(v))
        {
            answer.push_back("O");
        }
        else
        {
            answer.push_back("X");
        }
    }

    return answer;
}

 

추가적으로, stringstream 을 사용하지 않은 풀이를 다른 사람의 풀이에서 찾아보았고, 해당 풀이를 발견하여서 여기에 첨부해보도록 하겠다. 분기들을 나누고, 코드가 길어 보여서 어려워 보일 수 있겠으나, 결국 주어지는 입력의 형태에 대해서 제대로 분석하고 해당 입력의 형태에 맞게 숫자와 operator를 분리해낸다면 아래와 같은 코드를 짜는것이 그렇게 어렵지는 않을 것이다. 

#include <string>
#include <vector>
#include <iostream>
using namespace std;

vector<string> solution(vector<string> quiz) {
    vector<string> answer;
    for (auto str : quiz) {
        vector<int> v;
        bool flag = 0; int temp = 0; int cal = 0; int flag2 = 0;
        for (auto c : str) {
            if (c == ' ') {
                if (flag2) {
                    if (flag) {
                        v.push_back(-temp);
                    }
                    else {
                        v.push_back(temp);
                    }
                    temp = 0;
                    flag = 0;
                    flag2 = 0;
                }
            }
            else if (c == '+') {
                flag = 0;
            }
            else if (c == '-') {
                flag = !flag;
            }
            else if (c == '=') {
                flag = 0;
            }
            else {
                flag2 = 1;
                temp = temp * 10 + c - '0';
            }
        }

        if (flag) temp = -temp;

        for (auto n : v) {
            cal += n;
        }

        if (cal == temp) answer.push_back("O");
        else answer.push_back("X");
    }
    return answer;
}
  Comments,     Trackbacks