๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ฏ | ๋ฐฑ์ค€/๐Ÿ™‚ | Silver

[Kotlin] ๋ฐฑ์ค€ 16506๋ฒˆ CPU

by immgga 2024. 8. 23.

์ถœ์ฒ˜: unsplash.com

 

CPU(16506๋ฒˆ)

Silver 5

#๊ตฌํ˜„

 

๋ฌธ์ œ ๋‚ด์šฉ

 

 

๋ฌธ์ œ ์ ‘๊ทผ

์œ„ ํ‘œ๋ฅผ ์ฐธ๊ณ ํ•ด์„œ opcode, rD, rA, rB(#C)๊ฐ€ ์ฃผ์–ด์งˆ ๋•Œ, ๋ฌธ์ œ์— ์ •์˜๋œ ๋ฒˆ์—ญ ๋ฐฉ๋ฒ•์œผ๋กœ ์–ด์…ˆ๋ธ”๋ฆฌ์–ด๋ฅผ ๋ฒˆ์—ญํ•ด์„œ ๊ธฐ๊ณ„์–ด๋กœ ์ถœ๋ ฅํ•œ๋‹ค.

๊ฐ ๋ฌธ์ œ์— ํ•„์š”ํ•œ ์กฐ๊ฑด๋“ค์ด ๋ญ๊ฐ€ ์žˆ๋Š”์ง€ ์ •๋ฆฌํ•ด ๋ณด๊ฒ ๋‹ค. ๊ธฐ๊ณ„์–ด๋Š” ์ด 16๊ฐœ์˜ 0๊ณผ 1๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.

16๊ฐœ์˜ ์ˆ˜๋“ค์ด ์ ์šฉ๋˜๋Š” ์กฐ๊ฑด์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

1. 0~3๋ฒˆ์งธ๊นŒ์ง€์˜ ์ˆ˜๋Š” opcode์— ๋งž๊ฒŒ ๊ตฌ์„ฑํ•ด ์ฃผ๋ฉด ๋œ๋‹ค. ์œ„ ํ‘œ ์ฐธ๊ณ .

2. 4๋ฒˆ์งธ ์ˆ˜๋Š” opcode๊ฐ€ C๋กœ ๋๋‚˜๋ฉด 1, ์•„๋‹ˆ๋ฉด 0

3. 5๋ฒˆ์งธ ์ˆ˜๋Š” 0 ๊ณ ์ •.

4. 6~8๋ฒˆ์งธ ์ˆ˜๋Š” rD์˜ 2์ง„์ˆ˜๊ฐ’.

5. 9~11๋ฒˆ์งธ ์ˆ˜๋Š” rA์˜ 2์ง„์ˆ˜๊ฐ’, NOT์˜ ๊ฒฝ์šฐ๋Š” 0 ๊ณ ์ •.

6.12~15๋ฒˆ์งธ ์ˆ˜๋Š” opcode๊ฐ€ C๋กœ ๋๋‚  ๋•Œ๋Š” #C์˜ 2์ง„์ˆ˜๊ฐ’, ์•„๋‹ˆ๋ฉด rB์˜ 2์ง„์ˆ˜๊ฐ’๊ณผ 15๋ฒˆ์งธ ์ˆ˜๋Š” 0 ๊ณ ์ •.

 

์•„๋ž˜์˜ ์กฐ๊ฑด๋“ค์„ ๊ตฌํ˜„ํ•ด ์ฃผ๋ฉด ๋œ๋‹ค.

 

<์กฐ๊ฑด 1>

์šฐ์„  1๋ฒˆ ์กฐ๊ฑด์˜ ๊ฒฝ์šฐ๋Š” 25๊ฐ€์ง€์˜ ์ˆ˜์—์„œ 2๊ฐœ์”ฉ ๋ฌถ์—ฌ์žˆ๊ธฐ ๋•Œ๋ฌธ์—(NOT ์ œ์™ธ) contains๋ฅผ ์ด์šฉํ•ด 2๊ฐ€์ง€์˜ ์ž…๋ ฅ ๊ฒฝ์šฐ๋ฅผ ํ•œ ๋ฒˆ์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

if (opCode.contains("ADD"))

ADD๋ฅผ ํฌํ•จํ•˜๋Š” ์กฐ๊ฑด์„ ์ ์šฉํ•˜๋ฉด ADD์™€ ADDC ๋ชจ๋‘๋ฅผ ์ €๊ฒฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์–ด์ฐจํ”ผ ADD์™€ ADDC์˜ 0~3์ž๋ฆฌ ์ˆ˜๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

<์กฐ๊ฑด 2>

4๋ฒˆ์งธ ์ˆ˜๋ฅผ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” opcode์˜ ๋งˆ์ง€๋ง‰ ์ˆ˜๊ฐ€ C๋กœ ๋๋‚˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

if (opCode.last() == 'C')

5๋ฒˆ์งธ ์ˆ˜๋Š” 0 ๊ณ ์ •์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ™์ด ๋„ฃ์–ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

 

<์กฐ๊ฑด 3>

6~8๋ฒˆ์งธ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๊ฑด ๋”ฑํžˆ ์กฐ๊ฑด์ด ํ•„์š”ํ•˜์ง€ ์•Š์•„์„œ ๋„˜์–ด๊ฐ€๊ณ , 9~11๋ฒˆ์งธ ์ˆ˜๋ฅผ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” opcode๊ฐ€ MOV, MOVC ๊ฑฐ๋‚˜ NOT์ธ ๊ฒฝ์šฐ๋งŒ 000์ด๊ณ  ๋‚˜๋จธ์ง€๋Š” rA์˜ 2์ง„์ˆ˜๊ฐ’์ด๋‹ค.

if (opCode.contains("MOV") || opCode.contains("NOT"))

 

<์กฐ๊ฑด 4>

12~15๋ฒˆ์งธ ์ˆ˜๋Š” ์ข€ ๋ณต์žกํ•  ์ˆ˜ ์žˆ๋‹ค.

๋งˆ์ง€๋ง‰ opcode๊ฐ€ C๋กœ ๋๋‚  ๋•Œ๋Š” rB๋ฅผ 4์ž๋ฆฌ์˜ 2์ง„์ˆ˜๋กœ ๋‚˜ํƒ€๋‚ด๊ณ , ์•„๋‹Œ ๊ฒฝ์šฐ๋Š” 3์ž๋ฆฌ์˜ 2์ง„์ˆ˜์™€ ๋์— 0์„ ๋ถ™์—ฌ์ค€๋‹ค.

if (opCode.last() == 'C')

 

๋งˆ์ง€๋ง‰์œผ๋กœ ์ง„์ˆ˜ ๋ณ€ํ™˜ ๊ฒฐ๊ณผ๋ฅผ 3์ž๋ฆฌ ๋˜๋Š” 4์ž๋ฆฌ๋กœ ๋‚˜ํƒ€๋‚ด์•ผ ํ•œ๋‹ค.

๊ทธ๊ฒƒ์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด์„œ๋Š” string์œผ๋กœ ๋ณ€ํ™˜ ํ›„, padStart()๋ฅผ ์ด์šฉํ•ด ๋ฌธ์ž์—ด์˜ length๋ฅผ ๊ณ ์ •ํ•˜๊ณ , length๊ฐ€ ๋ถ€์กฑํ•œ ๊ฒฝ์šฐ ํŠน์ • ๋ฌธ์ž๋กœ ์ฑ„์šธ ์ˆ˜ ์žˆ๋‹ค.

rB.toString(2).padStart(4, '0')

์œ„ ์ฝ”๋“œ๋Š” length๋ฅผ 4๋กœ ์„ค์ •ํ•˜๊ณ , ๋ถ€์กฑํ•œ ๋ถ€๋ถ„์€ ์•ž์„ 0์œผ๋กœ ์ฑ„์šด๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด 11์ด ๋“ค์–ด์˜ค๋ฉด 0011์ด ๋˜๊ฒŒ ๋œ๋‹ค.

 

 

๋ฌธ์ œ ํ•ด๊ฒฐ ์ฝ”๋“œ

๋”๋ณด๊ธฐ
import java.io.BufferedReader
import java.io.InputStreamReader

fun main() = with(BufferedReader(InputStreamReader(System.`in`))) {
    val case = readLine().toInt()

    for (i in 0 until case) {
        val assembly = readLine().split(" ")
        val opCode = assembly[0]
        val (rD, rA, rB) = assembly.subList(1, assembly.size).map { it.toInt() }
        val machineLanguage = StringBuilder()

        // 0 ~ 3๋ฒˆ
        if (opCode.contains("ADD")) machineLanguage.append("0000")
        else if (opCode.contains("SUB")) machineLanguage.append("0001")
        else if (opCode.contains("MOV")) machineLanguage.append("0010")
        else if (opCode.contains("AND")) machineLanguage.append("0011")
        else if (opCode.contains("OR")) machineLanguage.append("0100")
        else if (opCode.contains("NOT")) machineLanguage.append("0101")
        else if (opCode.contains("MULT")) machineLanguage.append("0110")
        else if (opCode.contains("LSFTL")) machineLanguage.append("0111")
        else if (opCode.contains("LSFTR")) machineLanguage.append("1000")
        else if (opCode.contains("ASFTR")) machineLanguage.append("1001")
        else if (opCode.contains("RL")) machineLanguage.append("1010")
        else if (opCode.contains("RR")) machineLanguage.append("1011")

        // 4๋ฒˆ
        if (opCode.last() == 'C') machineLanguage.append("1")
        else machineLanguage.append("0")

        // 5๋ฒˆ
        machineLanguage.append("0")

        // 6 ~ 8๋ฒˆ
        machineLanguage.append(rD.toString(2).padStart(3, '0'))

        // 9 ~ 11๋ฒˆ
        if (opCode.contains("MOV") || opCode.contains("NOT")) machineLanguage.append("000")
        else machineLanguage.append(rA.toString(2).padStart(3, '0'))

        // 12 ~ 15๋ฒˆ
        if (opCode.last() == 'C') {
            machineLanguage.append(rB.toString(2).padStart(4, '0'))
        } else {
            machineLanguage.append("${rB.toString(2).padStart(3, '0')}0")
        }

        println(machineLanguage.toString())
    }
}

 

๋ฌธ์ œ ํ’€์ด

์ž…๋ ฅ์„ ๋ฐ›๊ณ  ์กฐ๊ฑด 1, 2, 3, 4๋ฅผ ์ ์šฉํ•ด 16์ž๋ฆฌ์˜ ๊ธฐ๊ณ„์–ด๋กœ ๋ฒˆ์—ญํ•ด์„œ ์ถœ๋ ฅํ•˜๋ฉด ๋œ๋‹ค.

 

 

๋ฌธ์ œ ํ•ด๊ฒฐ ๊ณผ์ •

๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ์กฐ๊ฑด์ด ๋งŽ๋‹ค. ๋˜ํ•œ padStart ๊ตฌํ˜„ ์œ„์น˜๋ฅผ ์ž˜๋ชป ์žก์•„์„œ ํ—ค๋งธ์—ˆ๋˜ ์ ๋„ ์žˆ๋‹ค.

728x90