※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 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 |