프로그래머스

프로그래머스 [PCCP 기출문제] 4번 / 수식 복원하기

콩순이냉장고 2024. 10. 22. 07:02

문제 URL : https://school.programmers.co.kr/learn/courses/30/lessons/340210

 

프로그래머스

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

programmers.co.kr

 

진법 계산문제입니다. 

 

최소진법부터 찾아줘야합니다. 모든수식을 확인후 최소진법~9 진법까지 확인후

x가 없는 수식들중에서 최소진법~9진법까지 같은 수가 나온다면

 

그 진법들만으로 x가 있는 수식을 계산해야합니다.

그리고 x를 계산해서 하나의 결과만 나온다면 그결과값을 출력해주고

2개이상의 결과값이 나온다면 ? 표를 넣어서 출력해주면 되기때문에

문제만 잘 이해하셨더라면 어렵지 않은 문제입니다.

 

소스코드 : 

#include <bits/stdc++.h>
using namespace std;
vector<string> split(string &s,char delimiter = ' '){
    stringstream ss(s);
    string temp;
    vector<string> v;
    while(getline(ss,temp,delimiter))v.push_back(temp);
    return v;
}

int tobase(string t,int n){
    int res = 0;
    int j =0;
    for(int i =t.size()-1;i>=0;i--){
        res +=(t[i]-'0')*pow(n,j++);
    }
    return res;
}
string tobase(int t,int n){
    string s;
    if(t==0)return "0";
    while(t){
        s+=to_string(t%n);
        t/=n;
    }
    reverse(s.begin(),s.end());
    return s;
}
int cal(string a,string b ,string c,int base){
    if(c=="+")
        return tobase(a,base)+tobase(b,base);
    return tobase(a,base)-tobase(b,base);
}
vector<string> solution(vector<string> expressions) {
    vector<string> answer;
    int jin = 2;
    vector<vector<string>> exp,nonexp;
    for(string &e:expressions){
        vector<string> v= split(e);
        vector<int> t;
        if(v.back()=="X"){
            nonexp.push_back(v);
        }
        else{
            exp.push_back(v);
        }
        for(char c:e){
            if(isdigit(c))
                jin = max(jin,c-'0'+1);
        }
    }
    vector<int> bv;
    for(int b = jin;b<=9;b++){
        bool flag= true;
        for(vector<string> &e:exp){
            int c = cal(e[0],e[2],e[1],b);
            int result = tobase(e[4],b);
            if(c!=result){
                flag=false;
                break;
            }
        }
        if(flag)bv.push_back(b);
    }

    for(vector<string> &ne :nonexp){
        set<string> r;
        for(int b:bv){
            int c = cal(ne[0],ne[2],ne[1],b);
            r.insert(tobase(c,b));
        }
        if(r.size()==1)
            answer.push_back(ne[0]+" "+ne[1]+" "+ne[2]+" = "+*r.begin());
        else
            answer.push_back(ne[0]+" "+ne[1]+" "+ne[2]+" = "+"?");
    }
    return answer;
}

궁금한점 혹은 모르는점 어떤질문이든 댓글은 언제나 환영입니다.