본문 바로가기
Problem Solving/Baekjoon

[백준] 16506 CPU - Implementation / Java

by graycode 2022. 6. 22.

 문제 링크

 

16506번: CPU

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

www.acmicpc.net

 

 풀이 과정

뒷자리에 C가 붙는 경우를 제외한 각각의 opcode는 0 ~ 11까지의 이진수의 값을 갖는다.

각 코드를 배열에 저장하고 각각의 인덱스에 대응하는 십진수를 이진수로 변환할 함수를 생성한다.

 

변환하고자 하는 값을 2로 연속해서 나눈 나머지 값을 순차적으로 나열 후 해당 문자열을 뒤집어 변환하며

이 함수를 활용해 나머지 각각의 값과 자릿수를 매개변수로 넣어 3~4 자리 이진수 값이 반환되고,

이를 주어진 조건에 맞게 결합한 전체 이진수 값을 출력한다.

 

 풀이 코드

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

public class Main {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringTokenizer st;

		int n = Integer.parseInt(br.readLine());
		String[] codes = { "ADD", "SUB", "MOV", "AND", "OR", "NOT", "MULT", "LSFTL", "LSFTR", "ASFTR", "RL", "RR" };

		for (int i = 0; i < n; i++) {
			st = new StringTokenizer(br.readLine());
			String code = st.nextToken();
			int rD = Integer.parseInt(st.nextToken());
			int rA = Integer.parseInt(st.nextToken());
			int bc = Integer.parseInt(st.nextToken());

			for (int j = 0; j < codes.length; j++) {
				if (code.equals(codes[j])) {
					bw.write(binary(j, 4) + "00" + binary(rD, 3) + binary(rA, 3) + binary(bc, 3) + '0' + "\n");
					break;
				}
				if (code.equals(codes[j] + 'C')) {
					bw.write(binary(j, 4) + "10" + binary(rD, 3) + binary(rA, 3) + binary(bc, 4) + "\n");
					break;
				}
			}
		}

		bw.flush();
	}

	private static String binary(int n, int digit) {
		StringBuilder sb = new StringBuilder();

		for (int i = 0; i < digit; i++) {
			sb.append(n % 2);
			n = n / 2;
		}

		return sb.reverse().toString();
	}

}

댓글