Uknow's Lab.
article thumbnail

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진법 변환하는 법을 처음 배웠던 것 같은데,

당시에는 이걸 어따 써... 하면서 배웠던 걸, 꽤 요긴하게 쓰고 있어요.

역시 배워둬서 나쁜 건 없나 봅니다.

profile

Uknow's Lab.

@유노 Uknow

인생은 Byte와 Double 사이 Char다. 아무말이나 해봤습니다.