BOJ 6568 - 귀도 반 로썸은 크리스마스날 심심하다고 파이썬을 만들었다 링크
(2023.05.10 기준 G5)
32바이트 메모리, 8비트짜리 가산기, 5비트짜리 프로그램 카운터(pc)로 이루어져 있는 컴퓨터가 있다.
각 메모리 별로 코드(명령어)가 주어진다. 프로그램이 종료되었을 때의 가산기 값을 8비트 2진수 형태로 출력
그대로 구현
문제 그대로 구현하는 문제이긴 한데.. 컴퓨터 자료구조를 제대로 공부하지 않았다면 문제 자체가 이해가 어려울 수 있다.
(내가 그랬다..)메모리 주소는 총 32개다. 그리고 메모리 주소별로 명령어와 피연산자가 포함되어 있는 코드가 32개 주어진다.
PC와 가산기 값은 0부터 시작한다. 그리고 PC는 이제 실행되어야 하는 메모리 주소를 가르키는 값이다. PC는 메모리 주소를 가르킨 다음에 1 증가 된다.
명령어는 나와 있는 그대로 따라가면 된다.
#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';
}
}
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))