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 ๊ตฌํ ์์น๋ฅผ ์๋ชป ์ก์์ ํค๋งธ์๋ ์ ๋ ์๋ค.
'๐ฏ | ๋ฐฑ์ค > ๐ | Silver' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Kotlin, S2] ๋ฐฑ์ค 1912๋ฒ ์ฐ์ํฉ (0) | 2024.08.26 |
---|---|
[Kotlin, S2] ๋ฐฑ์ค 2716๋ฒ ์์ญ์ด ๋งค๋ฌ๊ธฐ (0) | 2024.08.25 |
[Kotlin, S5] ๋ฐฑ์ค 11068๋ฒ ํ๋ฌธ์ธ ์ (0) | 2024.08.23 |
[Kotlin, S1] ๋ฐฑ์ค 1991๋ฒ ํธ๋ฆฌ ์ํ (0) | 2024.08.21 |
[Kotlin, S3] ๋ฐฑ์ค 1904๋ฒ 01ํ์ผ (0) | 2024.08.20 |