-
[백준/BOJ] 16506번 CPU (C++)알고리즘 문제풀이/백준 2021. 10. 10. 18:58
https://www.acmicpc.net/problem/16506
다시 풀기 : 제한시간 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"; } }
'알고리즘 문제풀이 > 백준' 카테고리의 다른 글
[백준/BOJ] 2146번 다리 만들기 (C++) (0) 2021.10.26 [백준/BOJ] 2468번 안전 영역 (C++) (0) 2021.10.13 [백준/BOJ] 3568번 iSharp (C++) (0) 2021.10.10 [백준/BOJ] 2615번 오목 (C++) (0) 2021.10.05 [백준/BOJ] 1063번 킹 (C++) (0) 2021.10.01