본문 바로가기
Problem Solving/백준

[백준|파이썬] 16506: CPU (실버5)

by 청량리 물냉면 2023. 5. 6.
반응형
문제

https://www.acmicpc.net/problem/16506

 

16506번: CPU

디지털하드웨어설계 과목의 최종 프로젝트는 16-bit CPU를 설계하고 Verilog 언어로 구현하는 것이다. 본인이 구현한 CPU가 제대로 동작하는지 테스트하기 위해서는 기계어 코드를 입력으로 주어야

www.acmicpc.net

 

 

🐍파이썬
import sys
input=sys.stdin.readline
n = int(input())
cpu = {"ADD": "0000", "SUB": "0001", "MOV":"0010",
"AND":"0011", "OR":"0100", "NOT":"0101", "MULT":"0110",
"LSFTL":"0111", "LSFTR":"1000", "ASFTR":"1001",
"RL":"1010", "RR":"1011"}
for _ in range(n):
bit4 = 0
a = list(input().split())
if a[0][-1] == "C": #마지막 알파벳이 C인 경우 비트4가 1
print(cpu[a[0][:-1]], end="")
print("1", end="")
bit4 = 1 #비트4가 1
else:
print(cpu[a[0]], end="")
print("0", end="")
print("0", end="") #비트5, 항상 0
print(bin(int(a[1]))[2:].zfill(3), end="") #비트6~8, rD
print(bin(int(a[2]))[2:].zfill(3), end="") #비트9~11, rA
if bit4 == 0: #rB, 12~14, 비트15=0
print(bin(int(a[3]))[2:].zfill(3), end="")
print("0")
else: ##C, 12~15
print(bin(int(a[3]))[2:].zfill(4))
💡 숫자 자리수 맞추기(zfill, rjust, ljust)
"13".zfill(5)
# 00013 -> 5자리수, 왼쪽 패딩

"6".rjust(5, "0")
# 00006 -> 5자리수, 왼쪽 패딩

"7".ljust(5, "0")
# 70000 -> 5자리수, 오른쪽 패딩

 

 

다른 풀이 방법

import sys
iterations = int(sys.stdin.readline())
opcodes = ['ADD', 'ADDC',
'SUB', 'SUBC',
'MOV', 'MOVC',
'AND', 'ANDC',
'OR', 'ORC',
'NOT', 'DUMMY',
'MULT', 'MULTC',
'LSFTL', 'LSFTLC',
'LSFTR', 'LSFTRC',
'ASFTR', 'ASFTRC',
'RL', 'RLC',
'RR', 'RRC'
]
for i in range(iterations):
mc = 0
opcode, rD, rA, rB = sys.stdin.readline().split()
code = opcodes.index(opcode)
mc += code * 2**11
mc += int(rD) * 2**7
mc += int(rA) * 2**4
mc += int(rB) * 2**(1-code%2)
print(bin(mc)[2:].zfill(16))

 

반응형