Problem 문제풀이
구현 그 자체인 문제였다. 어셈블리어 코드를 기계어 코드로 바꿔주는 작업으로 string 연산을 공부하기에 좋은 문제같다.
이 문제를 풀기 위해서는 substring을 이용한 split을 할 수 있어야한다. Python이었으면 5분이면 풀었읍읍…
substring의 사용법은 다음과 같다.
(문자열).substr(시작 index, 자르고 싶은 길이);
이제 substr함수를 이용해서 띄어쓰기를 기준으로 주어진 문자열을 split해보겠다.
cin >> N;
cin.clear();
cin.ignore(); //이거 안해주면 getline에서 공백을 받아버린다.
while (N--)
{
vector<int>ans(16);
vector<string>v;
getline(cin, str);
int prev = 0;
for (int i = 0; i < str.length(); i++)
{
if (str[i] == ' ')
{
string sub = str.substr(prev, i - prev);
prev = i + 1;
v.push_back(sub);
}
}
v.push_back(str.substr(prev, str.length() - prev));
}
vector안에 어셈블리어 코드가 보기 좋게 들어갔다. 이제 마지막 operand가 상수일 경우 2가지를 생각해주어야 한다.
- 상수일 경우 ans[4] = 1, ans[12~15]사용
- 상수가 아닐 경우 ans[4] = 0, ans[12~14]사용 ans[15]=0
if (v[0].back() == 'C')
{
ans[4] = 1; // 1.을 고려한 코드
v[0].pop_back();
}
int rDPos = 8;
int rD = stoi(v[1]);
while (rD > 0)
{
ans[rDPos] = (rD % 2);
rD /= 2;
rDPos--;
}
int rAPos = 11;
int rA = stoi(v[2]);
while (rA > 0)
{
ans[rAPos] = (rA % 2);
rA /= 2;
rAPos--;
}
int operandPos = 14+ans[4]; // 2.를 고려한 코드
int operand = stoi(v[3]);
while (operand > 0)
{
ans[operandPos] = (operand % 2);
operand /= 2;
operandPos--;
}
마지막으로 전체 코드를 첨부한다. (이게 최선이었냐고 묻지는 말아달라)
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int N;
string str;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
cin >> N;
cin.clear();
cin.ignore();
while (N--)
{
vector<int>ans(16);
vector<string>v;
getline(cin, str);
int prev = 0;
for (int i = 0; i < str.length(); i++)
{
if (str[i] == ' ')
{
string sub = str.substr(prev, i - prev);
prev = i + 1;
v.push_back(sub);
}
}
v.push_back(str.substr(prev, str.length() - prev));
if (v[0].back() == 'C')
{
ans[4] = 1;
v[0].pop_back();
}
if(v[0] == "SUB")
{
ans[3] = 1;
}
else if (v[0] == "MOV")
{
ans[2] = 1;
}
else if (v[0] == "AND")
{
ans[2] = 1;
ans[3] = 1;
}
else if (v[0] == "OR")
{
ans[1] = 1;
}
else if (v[0] == "NOT")
{
ans[1] = 1;
ans[3] = 1;
}
else if (v[0] == "MULT")
{
ans[1] = 1;
ans[2] = 1;
}
else if (v[0] == "LSFTL")
{
ans[1] = 1;
ans[2] = 1;
ans[3] = 1;
}
else if (v[0] == "LSFTR")
{
ans[0] = 1;
}
else if (v[0] == "ASFTR")
{
ans[0] = 1;
ans[3] = 1;
}
else if (v[0] == "RL")
{
ans[0] = 1;
ans[2] = 1;
}
else if (v[0] == "RR")
{
ans[0] = 1;
ans[2] = 1;
ans[3] = 1;
}
int rDPos = 8;
int rD = stoi(v[1]);
while (rD > 0)
{
ans[rDPos] = (rD % 2);
rD /= 2;
rDPos--;
}
int rAPos = 11;
int rA = stoi(v[2]);
while (rA > 0)
{
ans[rAPos] = (rA % 2);
rA /= 2;
rAPos--;
}
int operandPos = 14+ans[4];
int operand = stoi(v[3]);
while (operand > 0)
{
ans[operandPos] = (operand % 2);
operand /= 2;
operandPos--;
}
for (int i = 0; i < ans.size(); i++)
{
cout << ans[i];
}
cout << '\n';
}
return 0;
}