※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 16506번 문제인 CPU이다.
문제는 아래 링크를 확인하자.

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

 

16506번: CPU

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

www.acmicpc.net

 

민호가 설계한 CPU의 16-bit 단위 명령어의 구조를 따라 어셈블리어를 기계어로 번역하는 프로그램을 작성하는 문제이다.

 

opcode, rD, rA, rB의 값을 각각 대응되는 기계어로 출력해 문제를 해결하자. 각 값을 대응되는 값으로 바꾸는 작업은 map 등으로 간편하게 할 수 있다.

 

각 opcode가 'C'로 끝나는지를 따로 저장해 구현을 더 간소화할 수도 있다.

 

사용하지 않는 비트(5번 비트) 등을 빼먹고 구현하지 않도록 주의하자.

 

아래는 제출한 소스코드이다.

#include <iostream>
#include <string>
#include <vector>
#include <map>
using namespace std;

int T;
map<string, string> mp;
string s; int rD, rA, X, isC;
string BIT3[8] = { "000", "001", "010", "011", "100", "101", "110", "111" };
string BIT4[16] = { "0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111" };

void solve() {
	cin >> s >> rD >> rA >> X;
	if (s.back() == 'C') isC = 1, s.pop_back();
	else isC = 0;

	cout << mp[s] << isC << '0' << BIT3[rD] << BIT3[rA];
	if (isC) cout << BIT4[X] << '\n';
	else cout << BIT3[X] << '0' << '\n';
}

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	mp.insert(make_pair("ADD", "0000"));
	mp.insert(make_pair("SUB", "0001"));
	mp.insert(make_pair("MOV", "0010"));
	mp.insert(make_pair("AND", "0011"));
	mp.insert(make_pair("OR", "0100"));
	mp.insert(make_pair("NOT", "0101"));
	mp.insert(make_pair("MULT", "0110"));
	mp.insert(make_pair("LSFTL", "0111"));
	mp.insert(make_pair("LSFTR", "1000"));
	mp.insert(make_pair("ASFTR", "1001"));
	mp.insert(make_pair("RL", "1010"));
	mp.insert(make_pair("RR", "1011"));

	cin >> T;
	while (T--) solve();
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 20157 // C++] 화살을 쏘자!  (1) 2024.03.05
[BOJ 14670 // C++] 병약한 영정  (0) 2024.03.04
[BOJ 26424 // C++] Coloring Game  (0) 2024.03.02
[BOJ 29812 // C++] 아니 이게 왜 안 돼  (0) 2024.03.01
[BOJ 24504 // C++] blobcry  (1) 2024.02.29

+ Recent posts