코딩테스트

[백준/파이썬] 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안에서 원하는 자리수를 입력하면 맞게 만들어준다는걸 찾았고 더 간단하게 바꾸었다. 다음에는 이를 더욱 활용해야겠다.