알고리즘 부셔버렷/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%(많은 편))

 

 

구현 문제는 문제를 잘 이해해야한다 생각드네요.

비트 연산이나 나누기 연산 같은 것도 다시 공부할 수 있어 유익했습니다.

 

 

 

 

 

 

긴 글 읽어주셔서 감사합니다. 

부족한 점이 있다면 부디 알려주시면 감사하겠습니다.