알고리즘 부셔버렷/ProblemSolving
[BOJ] 6568번 귀도 반 로썸은 크리스마스날 심심하다고 파이썬을 만들었다. 문제풀이 c++
Unagi_zoso
2023. 4. 8. 18:40
문제 설명 |
본 문제는 백준의 6568번 문제 입니다.
https://www.acmicpc.net/problem/6568
구현문제
파일을 다 읽을 때까지(EOF) 입력을 받습니다.
32Byte의 메모리와 8bit 가산기, 5bit의 프로그램 카운터가 존재합니다.
명령어의 크기는 1Byte입니다.
해결 과정 |
명령어는 1Byte이고 메모리는 32Byte이므로 최대 32개의 명령어를 가질 수 있습니다.
구현 문제인 만큼 고려할 부분이 조금 있습니다.
입력이 이진수배열의 문자열인 만큼 이를 파싱해야합니다.
그리고 명령어의 상위 3bit와 그외 하위 5bit를 나눠야합니다.
이는 상위 3bit를 먼저 구하기 위해 5bit 2^5을 나눈 몫이 상위 3bit이고
나눈 뒤 나머지는 하위 5bit가 됩니다.
그리고 가산기와 pc의 경우 overflow, underflow가 고려되어지게 구현하여야합니다.
이는 modulor 연산을 통해 할 수 있으며 단순 조건문을 통해서도 구현이 가능합니다.
코드 전문 |
#include <iostream>
#include <vector>
#include <string>
#include <cmath>
using namespace std;
int parse_str_to_bin(string str_bin) {
int ret = 0;
for (int i = 0; i < str_bin.size(); i++) {
ret += ((str_bin[i] - '0') * (pow(2,str_bin.size() - 1 - i)));
}
return ret;
}
int main() {
while (1) {
vector<int> memory;
for (int i = 0; i < 32; i++) {
string cur_oper;
cin >> cur_oper;
if (cin.eof()) return 0;
memory.push_back(parse_str_to_bin(cur_oper));
}
int pc = 0;
int adder = 0;
while (1) {
int type_of_oper = memory[pc] / 32;
int operand = memory[pc] % 32;
if (7 == type_of_oper) break;
pc = (pc + 1) % 32;
switch (type_of_oper)
{
case 0:
memory[operand] = adder;
break;
case 1:
adder = memory[operand];
break;
case 2:
if (0 == adder) pc = operand;
break;
case 4:
adder = (adder + 255) % 256;
break;
case 5:
adder = (adder + 1) % 256;;
break;
case 6:
pc = operand;
break;
default:
break;
}
}
for (int i = 7; i >= 0; i--) {
cout << ((adder >> i) & 1);
}
cout << '\n';
}
}
느낀 점 (잡설 99% , 배운점 1%(많은 편)) |
구현 문제는 문제를 잘 이해해야한다 생각드네요.
비트 연산이나 나누기 연산 같은 것도 다시 공부할 수 있어 유익했습니다.
긴 글 읽어주셔서 감사합니다.
부족한 점이 있다면 부디 알려주시면 감사하겠습니다.