코딩테스트
[백준/파이썬] 16506 CPU
Sun0727
2022. 6. 16. 20:48
#문제링크
https://www.acmicpc.net/problem/16506
16506번: CPU
디지털하드웨어설계 과목의 최종 프로젝트는 16-bit CPU를 설계하고 Verilog 언어로 구현하는 것이다. 본인이 구현한 CPU가 제대로 동작하는지 테스트하기 위해서는 기계어 코드를 입력으로 주어야
www.acmicpc.net
#나의풀이
import sys
if __name__ == '__main__':
T = int(sys.stdin.readline())
arr = {'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(T):
opcode, rD, rA, rB = sys.stdin.readline().split()
result = ''
if opcode[-1] == 'C':
result = arr[opcode[0:-1]] + '10'
else:
result = arr[opcode] + '00'
rD = format(int(rD), '03b')
rA = format(int(rA), '03b')
if opcode[-1] == 'C':
rB = format(int(rB), '04b')
else:
rB = format(int(rB), '03b') + '0'
result += rD + rA + rB
print(result)
#해설
귀찮은 구현문제이다.
먼저 opcode를 딕셔너리로 만들어서 저장해주었다. 이후 입력받는 입력값으로 값을 찾을때 사용한다.
최종 결과를 담을 변수 result를 미리 초기화 시켜주었다.
1. 입력받은 opcode 맨끝이 C일경우 4~5 비트가 10이 되고 아닐경우 00이다. opcode를 딕셔너리에서 찾아 값을 가져오고 뒤에 맞게 붙여주었다.
2. rD와 rA는 3비트로 사용되기 때문에 2진수로 바꾸고 3자리수로 만들어주었다.
3. rB는 opcode 마지막에 C일경우 #C가 되어 4자리가 되고 아닐경우 3자리에 0이 붙는다 조건문으로 구별하고 값을 바꿔주었다.
4. 결과값에 통합시키고 출력해주었다
#여담
처음에 맞췄을때는 format에서 자리수에 맞게 변환이 안되는줄 알고 2진수 변환후 1자리일때 2자리일때 구별해서 각 자리를 맞춰 더해줬는데 format안에서 원하는 자리수를 입력하면 맞게 만들어준다는걸 찾았고 더 간단하게 바꾸었다. 다음에는 이를 더욱 활용해야겠다.