[BOJ 6568] - 귀도 반 로썸은 크리스마스날 심심하다고 파이썬을 만들었다 (구현, C++, Python)

보양쿠·2023년 5월 10일
0

BOJ

목록 보기
121/260
post-custom-banner

BOJ 6568 - 귀도 반 로썸은 크리스마스날 심심하다고 파이썬을 만들었다 링크
(2023.05.10 기준 G5)

문제

32바이트 메모리, 8비트짜리 가산기, 5비트짜리 프로그램 카운터(pc)로 이루어져 있는 컴퓨터가 있다.
각 메모리 별로 코드(명령어)가 주어진다. 프로그램이 종료되었을 때의 가산기 값을 8비트 2진수 형태로 출력

알고리즘

그대로 구현

풀이

문제 그대로 구현하는 문제이긴 한데.. 컴퓨터 자료구조를 제대로 공부하지 않았다면 문제 자체가 이해가 어려울 수 있다. (내가 그랬다..)

메모리 주소는 총 32개다. 그리고 메모리 주소별로 명령어와 피연산자가 포함되어 있는 코드가 32개 주어진다.

PC와 가산기 값은 0부터 시작한다. 그리고 PC는 이제 실행되어야 하는 메모리 주소를 가르키는 값이다. PC는 메모리 주소를 가르킨 다음에 1 증가 된다.

명령어는 나와 있는 그대로 따라가면 된다.

코드

  • C++
#include <bits/stdc++.h>
using namespace std;

int bin_to_dec(int bin){ // 이진수를 십진수로 변환
    int dec = 0, bit = 1;
    while (bin){
        if (bin & 1) dec += bit;
        bit <<= 1;
        bin /= 10;
    }
    return dec;
}

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    int memory[32], code, adder, pc, cmd, x;
    bitset<8> result;

    while (true){
        // 메모리 주소별 코드 입력받기
        cin >> code;
        if (cin.eof()) break;
        memory[0] = bin_to_dec(code);

        for (int i = 1; i < 32; i++){
            cin >> code;
            memory[i] = bin_to_dec(code);
        }

        adder = pc = 0;
        while (true){
            cmd = memory[pc] / 32; x = memory[pc] % 32;
            pc = (pc + 1) % 32;

            if (cmd == 0) // STA x
                memory[x] = adder;
            else if (cmd == 1) // LDA x
                adder = memory[x];
            else if (cmd == 2){ // BEQ x
                if (!adder) pc = x;
            }
            else if (cmd == 3) // NOP
                continue;
            else if (cmd == 4) // DEC
                adder = (adder + 255) % 256;
            else if (cmd == 5) // INC
                adder = (adder + 1) % 256;
            else if (cmd == 6) // JMP x
                pc = x;
            else // HLT
                break;
        }

        result = adder;
        cout << result << '\n';
    }
}
  • Python
import sys; input = sys.stdin.readline

while True:
    # 메모리 주소별 코드 입력받기
    try:
        memory = [int(input().strip(), 2) for _ in range(32)]
    except:
        break

    adder = pc = 0
    while True:
        cmd, x = divmod(memory[pc], 32)
        pc = (pc + 1) % 32

        if cmd == 0: # STA x
            memory[x] = adder
        elif cmd == 1: # LDA x
            adder = memory[x]
        elif cmd == 2: # BEQ x
            if not adder:
                pc = x
        elif cmd == 3: # NOP
            continue
        elif cmd == 4: # DEC
            adder = (adder - 1) % 256
        elif cmd == 5: # INC
            adder = (adder + 1) % 256
        elif cmd == 6: # JMP x
            pc = x
        else: # HLT
            break

    print(bin(adder)[2:].zfill(8))
profile
GNU 16 statistics & computer science
post-custom-banner

0개의 댓글