본문 바로가기

공부/백준\BeakJoon

[BEAKJOON] 백준 1212번 : 8진수 2진수

반응형

https://www.acmicpc.net/problem/1212

 

1212번: 8진수 2진수

첫째 줄에 8진수가 주어진다. 주어지는 수의 길이는 333,334을 넘지 않는다.

www.acmicpc.net

문제

 

 

단순히 숫자 하나를 2진수에 맞게 치환해주면 되는 것 같아서 그렇게 코드를 작성했다.

 

num = str(input())
result = ''

for i in range(len(num)):
    if(num[i]=='0'):
        result += '000'
    elif(num[i]=='1'):
        result += '001'
    elif(num[i]=='2'):
        result += '010'
    elif(num[i]=='3'):
        result += '011'
    elif(num[i]=='4'):
        result += '100'
    elif(num[i]=='5'):
        result += '101'
    elif(num[i]=='6'):
        result += '110'
    elif(num[i]=='7'):
        result += '111'
print(int(result))

 

 

그러나 나온 결과는 시간초과!

원인을 파악해보니, Python에서 문자열을 합칠 때, +를 사용하는 것을 지양해야 한다.

문자열을 합칠 때, 다른언어와 다르게 파이썬의 문자열(String) 자료형은 immutable type이라, 문자열 내용을 복사할 수 없기 때문에, +로 합칠 경우 각각의 문자열을 새로운 메모리에 복사하여 새 문자열을 만든다.

 

왜, 파이썬의 문자열이 immutable type일까?
다른 불변 객체로는 정수, 부동 소수점, 튜플 및 부울이 있다.

name_1 = "Varun"
name_2 = "Varun"
print("id of name_1 = ", id(name_1))
print("id of name_2 = ", id(name_2))
위의 코드를 실행시키면, 우리는 name_1, 2의 아이디가 동일한 것을 확인 할 수 있다.

Python 에서 문자열은 변경 불가능하여 프로그래머가 객체의 내용을 변경할 수 없는데, 이것은 불필요한 버그를 피한다.

 

그래서 사실상 시간 복잡도가 O(n^2) 정도가 된다. 따라서, ''.join()을 사용해 문자열을 합쳐야 계산과정에서의 시간 복잡도가 줄어들 것이다.

 

그러면 수정해주자.

num = str(input())
result = []

for i in range(len(num)):
    if(num[i]=='0'):
        result.append('000')
    elif(num[i]=='1'):
        result.append('001')
    elif(num[i]=='2'):
        result.append('010')
    elif(num[i]=='3'):
        result.append('011')
    elif(num[i]=='4'):
        result.append('100')
    elif(num[i]=='5'):
        result.append('101')
    elif(num[i]=='6'):
        result.append('110')
    elif(num[i]=='7'):
        result.append('111')
print(int("".join(result)))

2차시도

num = int(input())
result = []
tmp = 0

while (num != 0):
    tmp = num % 10
    num /= 10
    if (tmp == 0):
        result.append('000')
    elif (tmp == 1):
        result.append('001')
    elif (tmp == 2):
        result.append('010')
    elif (tmp == 3):
        result.append('011')
    elif (tmp == 4):
        result.append('100')
    elif (tmp == 5):
        result.append('101')
    elif (tmp == 6):
        result.append('110')
    elif (tmp == 7):
        result.append('111')

result.reverse()
print(int("".join(result)))

 

 

 

파이썬 내장 함수로 바꿔주는게 있다.

num = int(input(), 8)

print(bin(num)[2:])

 

아래는 파이썬 내장 함수인 bin 함수인데, 처음에 num의 값을 10진수라고 인지한다.

근데,함수를 제대로 이해를 하지 못했다. 흐음,,

def bin__(num, max_bits=None):
    """
    Like built-in bin(), except negative values are represented in
    twos-compliment, and the leading bit always indicates sign
    (0=positive, 1=negative).

    //>>> bin(10)
    '0b0 1010'
    //>>> bin(~10)   # ~10 is -11
    '0b1 0101'
    """

    ceiling = 2 ** (num).bit_length()
    if num >= 0:
        s = bltns.bin(num + ceiling).replace('1', '0', 1)
    else:
        s = bltns.bin(~num ^ (ceiling - 1) + ceiling)
    sign = s[:3]
    digits = s[3:]
    if max_bits is not None:
        if len(digits) < max_bits:
            digits = (sign[-1] * max_bits + digits)[-max_bits:]
    return "%s %s" % (sign, digits)
반응형