코딩테스트/백준

백준 16506번 CPU 풀이/코드 (파이썬) 간단한 구현문제

RyanKwon 2021. 10. 31. 12:00
728x90

해설 코드만 궁금한 분은 깃허브링크 눌러주세요!

 

문제 설명

위 그림만 보면 뭘까? 싶지만 논리회로?공부를 해본 사람은 금방 감이 올 것 같다. 문제에서 주어지는건 어떤 새로운 언어인데, 그 언어는 opcode, rD, rA, rB로 구성돼있다. 그리고 이것들은 어떤 규칙에 따라서 이진법으로 바꿀 수 있는데 그 규칙에 따라서 10101111.. 이런식의 이진법으로 바꾸면 된다.

감이 안오면 예제를 보면 쉽다. 위에 설명보다 예제를 보는게 더 빠를때가 있다. 다만 세세한 조건은 예제만으로 알긴 힘드니 예제를 보고 다시 문제 읽는 습관을 들여야한다.,, 아무튼ㅋㅋㅋ 그냥 저냥 살짝 까다로운 구현문제라고 보면 된다.

 

 

 

문제 해결 논리

 

잘 보면 'C'가 있고 없고에 따라서 뒤에 0인지 1인지, 맨 뒤에 rB가 3자리인지 4자리인지가 결정된다. 따라서 이 부분만 유의하면 풀만하다. 사이에 NOT이 있지만 얘도 'C'가 붙지 않은 다른 opcode들과 같은 규칙으로 이진법을 구성하기 때문에 크게 신경쓰지 않아도 된다. MOV, NOT은 rA대신에 000을 넣으라고 하는데 예제에서 보니까 어차피 입력을 0으로 받는것 같길래 따로 처리한건 없었다. rD,rA,rB세개 다 bin 함수를 쓰고 자릿수대로 zfill함수를 써서 문자열을 붙여주면 된다. C가 안 붙은 경우는 맨 마지막에 0을 하나 더 붙여주면 된다.

딕셔너리에 ADD부터 다른 opcode들의 기본값 (C가 없는 경우)를 0000부터 1011까지 미리 매치해두고 쓰면 첫째 4자리 글자는 해결가능하다. 이 부분은 그냥 순서가 미리 정해진거라 딕셔너리나 리스트같은걸 활용해서 구현하는 수밖에 없다.

 

솔직히 어려운 문제는 아님. 티어도 실버5라서 사실 어.. 그냥 간단한 구현 연습하기 좋은 문제라고 생각한다. 이게 조금 더 어려웠으려면 맨 뒤에 'C'가 있는 다른 문자가 있었어야 했던 것 같다. 가령 ADD, ADDC 이렇게 있으면 맨 뒤에 C가 있는지 없는지만 판단하면 되지만 ADD, ADDC, ADC, ADCC 이런식으로 있어버리면 ADC와 같은 경우를 판별하기 위해 구현이 조금 더 복잡해진다. 이거 하나 추가한다고 얼마나 더 어려워지겠냐만은 그냥 이런식으로 했으면 조금 더 어렵긴 했을테니까.

 

생각해보니 만약 그랬다면 맨 뒤에 'C'가 있는지로 구별하지 않고 이게 기본값인지 아닌지로 판별 가능했을 것 같다. 딕셔너리에 기본값들을 미리 저장해뒀으니 만약 ADC가 딕셔너리의 키값중 하나인지 확인해보면 될 것 같다.

728x90