https://www.acmicpc.net/problem/1212
난이도 : 브론즈 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진법 변환하는 법을 처음 배웠던 것 같은데,
당시에는 이걸 어따 써... 하면서 배웠던 걸, 꽤 요긴하게 쓰고 있어요.
역시 배워둬서 나쁜 건 없나 봅니다.
'코딩테스트 > Kotlin' 카테고리의 다른 글
[백준 11179번] [Kotlin] 2진수 뒤집기 (0) | 2023.01.30 |
---|---|
[백준 1004번] [Kotlin] 어린 왕자 (0) | 2023.01.29 |
[백준 2109번] [Kotlin] 순회강연 (0) | 2023.01.24 |
[백준 8871번] [Kotlin] Zadanie próbne 2 (0) | 2023.01.23 |
[백준 8545번] [Kotlin] Zadanie próbne (0) | 2023.01.23 |