프로그래머스
프로그래머스 [PCCP 기출문제] 4번 / 수식 복원하기
콩순이냉장고
2024. 10. 22. 07:02
문제 URL : https://school.programmers.co.kr/learn/courses/30/lessons/340210
진법 계산문제입니다.
최소진법부터 찾아줘야합니다. 모든수식을 확인후 최소진법~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;
}
궁금한점 혹은 모르는점 어떤질문이든 댓글은 언제나 환영입니다.