2985번 : 세 수
문제는 다음과 같습니다.
https://www.acmicpc.net/problem/2985
2985번: 세 수
첫째 줄에 정인이가 원래 적어준 등식을 출력한다. 입력으로 주어진 숫자의 순서는 유지해야 하고, 등호 하나와 더하기, 빼기, 곱하기, 나누기 기호 중 하나로 이루어져 있어야 한다. 만약 등식
www.acmicpc.net
풀이 코드는 다음과 같습니다.
#include<iostream>
#include<vector>
#include <string>
#include<algorithm>
using namespace std;
bool compare(int a,int b)
{
if(a>b)
return true;
else
return false;
}
string func_plus(int a,int b,int c)
{
string temp{""};
if(compare(a,max(b,c)))
{
if(b+c==a)
{
temp=to_string(a)+"="+to_string(b)+"+"+to_string(c);
}
}
else if(a+b==c)
{
temp=to_string(a)+"+"+to_string(b)+"="+to_string(c);
}
return temp;
}
string func_minus(int a,int b,int c)
{
string temp{""};
if(compare(a,max(b,c)))
{
if(a-b==c)
{
temp=to_string(a)+"-"+to_string(b)+"="+to_string(c);
}
}
else if(b-c==a)
{
temp=to_string(a)+"="+to_string(b)+"-"+to_string(c);
}
return temp;
}
string func_multi(int a,int b,int c)
{
string temp{""};
if(compare(a,max(b,c)))
{
if(b*c==a)
{
temp=to_string(a)+"="+to_string(b)+"*"+to_string(c);
}
}
else if(a*b==c)
{
temp=to_string(a)+"*"+to_string(b)+"="+to_string(c);
}
return temp;
}
string func_div(int a,int b,int c)
{
string temp{""};
if(compare(a,max(b,c)))
{
if(a/b==c)
{
temp=to_string(a)+"/"+to_string(b)+"="+to_string(c);
}
}
else if(b/c==a)
{
temp=to_string(a)+"="+to_string(b)+"/"+to_string(c);
}
return temp;
}
int main()
{
vector<int>v(3);
cin>>v[0]>>v[1]>>v[2];
if(func_plus(v[0],v[1],v[2])!="")
{
cout<<func_plus(v[0],v[1],v[2])<<endl;
return 0;
}
else if(func_minus(v[0],v[1],v[2])!="")
{
cout<<func_minus(v[0],v[1],v[2])<<endl;
return 0;
}
else if(func_multi(v[0],v[1],v[2])!="")
{
cout<<func_multi(v[0],v[1],v[2])<<endl;
return 0;
}
else if(func_div(v[0],v[1],v[2])!="")
{
cout<<func_div(v[0],v[1],v[2])<<endl;
return 0;
}
return 0;
}
반복되는 부분이 많아서 코드가 길어 보이지만 핵심은 다음과 같습니다.
1. 문제의 조건 상, 주어진 숫자의 순서는 유지되고 항상 정답이 존재한다.
2. 따라서 가장 처음 주어지는 수가 가장 큰지 작은지 확인하여 등호(=)가 먼저 올지 나중에 올지 정해진다.
2번의 말을 설명하자면 덧셈의 경우 주어진 세 수, (a, b, c) 중에서 가장 큰 수가 나머지 두 수를 합친 것과 같은지 확인해야 합니다.
그런데 이 때 a가 가장 크다면 수식은 a=b+c의 형태로 나타내야 하고 아니라면 a+b=c의 형태로 나타내야 합니다.
1번에서 조건 상 입력한 숫자는 순서가 바뀌지 않으므로 a+c=b같은 형태는 고려하지 않아도 되기 때문에 두 가지 경우만 확인해주면 됩니다.
곱셈도 덧셈과 마찬가지로 가장 큰 수가 두 수를 곱한 것과 같기 때문에 곱셈은 덧셈과 같은 알고리즘을 가지고
뺄셈의 경우에는 입력된 세 수 (a,b,c)중 맨 처음 입력한 a가 가장 큰 수라면 a-b=c의 형태가 되고 아닌 경우는 모두 a=b-c의 형태가 됩니다. 덧셈과는 형태가 반대로 되는 것을 알 수 있습니다. 나눗셈 역시 같은 알고리즘입니다.
main에서는 등식이 성립하면 등식을 출력하는 것만 실행합니다. 이때 문제에서 "등식이 여러 가지가 나올 수 있다면, 그중 하나만 출력한다."라고 했기 때문에 등식 하나를 출력했다면 return으로 바로 종료할 수 있도록 했습니다.