백준 16506 CPU

Posted by : at

Category : Solution


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가지를 생각해주어야 한다.

  1. 상수일 경우 ans[4] = 1, ans[12~15]사용
  2. 상수가 아닐 경우 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;
}

End


About GJ

안녕하세요 방문해주셔서 감사합니다. 혹시 보시면서 궁금하신것 있으시면 https://open.kakao.com/o/sivaz71c로 연락주세용~

Star
Useful Links