알고리즘 문제풀이/백준

[백준/BOJ] 16506번 CPU (C++)

노력의천재 2021. 10. 10. 18:58

https://www.acmicpc.net/problem/16506

 

16506번: CPU

디지털하드웨어설계 과목의 최종 프로젝트는 16-bit CPU를 설계하고 Verilog 언어로 구현하는 것이다. 본인이 구현한 CPU가 제대로 동작하는지 테스트하기 위해서는 기계어 코드를 입력으로 주어야

www.acmicpc.net

다시 풀기 : 제한시간 20분

 

빡구현 문제이다. 12~15번 비트 조건 처리를 하는데 조금 애먹었다. 문제 해결 방법 자체는 어렵지 않다. opcode에 해당하는 비트와 4, 5번 비트를 map을 선언해 미리 이진수 값을 넣어줬다. 나머지 입력값을 이진수로 바꿔서 더해주고, 12~15번 비트 처리일 때 4번 비트가 1이면 4개의 비트가 필요하므로, 이에 대한 처리를 따로 진행해줬다. (이때 getBinary 함수에 문자를 넘기는 것을 주의하자, 숫자가 아니다. 그리고 아스키 코드 값에 의해 문자도 숫자로 대응되기 때문에, 1 혹은 0에 해당하는 값이 겹치지 않게 조심!)

 

#include <iostream>
#include <unordered_map>
#include <algorithm>
using namespace std;

unordered_map<string, string> um;

string getBinary(int n, char flag) {
	string res = "";
	while(n) {
		if(n % 2 == 1) res.insert(0, "1");
		else res.insert(0, "0");
		n /= 2;
	}
	
	while(res.size() < 3) {
		res.insert(0, "0");
	}
	
	if(flag == '1') {
		while(res.size() < 4) {
			res.insert(0, "0");
		}
	} else if(flag == '0') {
		res += "0"; 
	}
	
	return res;
}

int main(void) {
//	ios_base::sync_with_stdio(false);
//	cin.tie(0);

	um["ADD"] = "000000";
	um["ADDC"] = "000010";
	
	um["SUB"] = "000100";
	um["SUBC"] = "000110";
	
	um["MOV"] = "001000";
	um["MOVC"] = "001010";
	
	um["AND"] = "001100";
	um["ANDC"] = "001110";
	
	um["OR"] = "010000";
	um["ORC"] = "010010";
	
	um["NOT"] = "010100";
	
	um["MULT"] = "011000";
	um["MULTC"] = "011010";
	
	um["LSFTL"] = "011100";
	um["LSFTLC"] = "011110";
	
	um["LSFTR"] = "100000";
	um["LSFTRC"] = "100010";
	
	um["ASFTR"] = "100100";
	um["ASFTRC"] = "100110";
	
	um["RL"] = "101000";
	um["RLC"] = "101010";
	
	um["RR"] = "101100";
	um["RRC"] = "101110";
	
	int N;
	cin >> N;
	for(int i = 0; i < N; i++) {
		string answer = "", opcode;
		int a, b, c;
		cin >> opcode >> a >> b >> c;
		answer += um[opcode];
		answer += getBinary(a, 'X');
		answer += getBinary(b, 'X');
		answer += getBinary(c, answer[4]);
		cout << answer << "\n";
	}
}