코딩테스트/Kotlin
[백준 1212번] [Kotlin] 8진수 2진수
유노 Uknow
2023. 1. 26. 21:24
https://www.acmicpc.net/problem/1212
1212번: 8진수 2진수
첫째 줄에 8진수가 주어진다. 주어지는 수의 길이는 333,334을 넘지 않는다.
www.acmicpc.net
난이도 : 브론즈 2
태그 : 수학, 구현, 문자열
설명
8진수를 2진수로 바꾸는 문제입니다.
저는 처음에는 Java의 Integer클래스가 기본으로 제공하는 parseInt, toOctalString() 등을 사용해 풀이하려 했는데,
런타임 에러를 받고, 왜 그런지 봤더니
수의 길이가 최대 333,334 자리네요. Long의 자료형에 담기에는 좀 깁니다.
조금 다르게 접근해야 할 것 같습니다.
8진수, 16진수는 사실 컴퓨터공학 계열에서 꽤나 많이 쓰입니다.
2진수와의 변환이 쉽기 때문이죠.
보통 2진수는 3자리씩 끊어 8진수로 변환할 수 있습니다
11001100을 예로 들자면,
011 / 001 / 100 으로, 각 자리 숫자를 10진법으로 바꾸면 3 / 1 / 4 가 됩니다.
반대의 경우도 마찬가지로,
314를 3 / 1 / 4 로 나누어, 011 / 001 / 100 으로 바꿀 수 있죠.
이 원리를 소스코드에 그대로 적용하면 됩니다.
소스코드
fun main() {
// 8진수 -> 2진수
// 8진수 1은 2진수 010, 8진수 2는 2진수 011, 8진수 3은 2진수 100
val parser = arrayOf("000", "001", "010", "011", "100", "101", "110", "111")
val str = readln()
if (str == "0") {
println(0)
return
}
val sb = StringBuilder()
for (c in str) {
sb.append(parser[c.digitToInt()])
}
// 시작부분 0 제거
println(sb.trimStart { it == '0' })
}
trimStart{it=='0'} 은 시작부분의 0을 지우겠다는 의미입니다.
후기
중학교때 2 <-> 8진법 변환하는 법을 처음 배웠던 것 같은데,
당시에는 이걸 어따 써... 하면서 배웠던 걸, 꽤 요긴하게 쓰고 있어요.
역시 배워둬서 나쁜 건 없나 봅니다.