-
[백준]16506 - CPU코테/백준 2023. 6. 19. 10:21
https://www.acmicpc.net/problem/16506
16506번: CPU
디지털하드웨어설계 과목의 최종 프로젝트는 16-bit CPU를 설계하고 Verilog 언어로 구현하는 것이다. 본인이 구현한 CPU가 제대로 동작하는지 테스트하기 위해서는 기계어 코드를 입력으로 주어야
www.acmicpc.net
어셈블리어를 주어진 조건에 맞게 번역하는 문제.
길지만 어려운 문제는 아니였다
#define _CRT_SECURE_NO_WARNINGS #include <string> #include <vector> #include <iostream> #include <algorithm> using namespace std; void func(string); void func2(int); void func3(char, int); int main() { vector<string> vs; /* vector<vector<string>> vvs(4); vs.push_back("MOVC 1 0 5"); vs.push_back("MOVC 2 0 10"); vs.push_back("ADD 3 1 2"); vs.push_back("SUB 4 1 2"); */ int N; cin >> N; cin.ignore(); vector<vector<string>> vvs(N); for (int i = 0; i < N; i++){ string sss; getline(cin, sss); vs.push_back(sss); } string tmp; for (int i = 0; i < vs.size(); i++) { for (int j = 0; j < vs[i].size()+1; j++) { if (vs[i][j] == ' ' || vs[i][j]=='\0') { vvs[i].push_back(tmp); tmp = ""; } else tmp.push_back(vs[i][j]); } } for (int i = 0; i < vvs.size(); i++) { string kkk = vvs[i][0]; func(kkk); func2(stoi(vvs[i][1])); func2(stoi(vvs[i][2])); char c = vvs[i][0][vvs[i][0].size()-1]; func3(c, stoi(vvs[i][3])); cout << '\n'; } } void func(string s) { if (s == "ADD") { cout << "00000"; } else if (s == "ADDC") { cout << "00001"; } else if (s == "SUB") { cout << "00010"; } else if (s == "SUBC") { cout << "00011"; } else if (s == "MOV") { cout << "00100"; } else if (s == "MOVC") { cout << "00101"; } else if (s == "AND") { cout << "00110"; } else if (s == "ANDC") { cout << "00111"; } else if (s == "OR") { cout << "01000"; } else if (s == "ORC") { cout << "01001"; } else if (s == "NOT") { cout << "01010"; } else if (s == "MULT") { cout << "01100"; } else if (s == "MULTC") { cout << "01101"; } else if (s == "LSFTL") { cout << "01110"; } else if (s == "LSFTLC") { cout << "01111"; } else if (s == "LSFTR") { cout << "10000"; } else if (s == "LSFTRC") { cout << "10001"; } else if (s == "ASFTR") { cout << "10010"; } else if (s == "ASFTRC") { cout << "10011"; } else if (s == "RL") { cout << "10100"; } else if (s == "RLC") { cout << "10101"; } else if (s == "RR") { cout << "10110"; } else if (s == "RRC") { cout << "10111"; } cout << "0"; } void func2(int i) { cout << (i / 4); cout << ((i % 4) / 2); cout << (((i % 4) % 2)); } void func3(char c, int i) { if (c != 'C') { func2(i); cout << "0"; } else { cout << (i / 8); cout << ((i % 8) / 4); cout << (((i % 8) % 4)/2); cout << (((i % 8) % 4) % 2); } }
https://velog.io/@beclever/C-%EB%B0%B1%EC%A4%80-16506%EB%B2%88-CPU
[C++] 백준 16506번: CPU
16506번: CPU주어진 어셈블리어 코드를 표를 참조해 기계어 코드로 바꿔야 한다.단순 구현 문제입니다. 문자열 처리와 10진수를 2진수로 변환하는 것에만 주의를 하면 되는 간단한 구현 문제였습니
velog.io
풀이 이후 찾아본 코드
나는 한 줄을 문자열로 받아 각각의 벡터로 나눴는데
그냥 위 글처럼 변수 여러개 선언해서 각각 넣으면 더 간단하게 해결됐을듯
무엇보다 MOV 같은 문자열도 순서대로 배열에 넣어서 2진법으로 처리하면 됐는데
문제를 너무 노가다로 푼것같다.
'코테 > 백준' 카테고리의 다른 글
[백준]6987 - 월드컵 (백트래킹) (0) 2023.06.19 [백준]2290 - LCD Test (구현) (0) 2023.06.19 [백준]3568 - iSharp (구현) (0) 2023.06.19 [백준]14500 - 테르로미노 (0) 2023.03.02 [백준]10818 - 최댓값 최솟값 (0) 2023.02.24