꾸준하게 거북이처럼

백준 1373번: 2진수 -> 8진수 변환 - 파이썬 본문

Algorithm 문제 & 공부

백준 1373번: 2진수 -> 8진수 변환 - 파이썬

somm12 2022. 7. 28. 16:16

 

 

1373번: 2진수 8진수

첫째 줄에 2진수가 주어진다. 주어지는 수의 길이는 1,000,000을 넘지 않는다.

www.acmicpc.net

처음에는 입력받은 2진수를 10진수로 변환하고, 다시 8진수로 변환하는 방법을 썼더니, 시간 초과가 나왔다.

다시 입력 받은 2진수를 뒤에서 부터 3자리씩 묶어서 8진수로 바로 변환해봤지만 역시나,, 시간 초과.

직접 변환 코드

bi = input()
countZero = len(bi) % 3

bi = ('0'*countZero) + bi
ans = ""

for i in range(len(bi)-1, 0 , -3):
    a = int(bi[i]) * 1 + int(bi[i - 1]) * 2 + int(bi[i - 2]) * 4
    ans += str(a)

print(ans[::-1])

입력 받은 수의 최대 자리수가 100만이고, for 문 안에 str, int 내장 함수를 사용! str()의 시간 복잡도는 O(logN)이다. 그래도 시간 제한내에 연산횟수가 나오는 걸로 예상했는데,, (logN)^2 *N 이여서 그런지 시간 초과가 나온다.

사실 파이썬에서는 oct라고 8진수로 변환을 해주는 내장 함수가 있다.

ex) oct(0b11001100) -> 0o314 가 반환됨.

따라서 내장함수를 이용해서 앞에 '0o'만 제외하고 print하기만 하면 된다.

수정 코드

print(oct(int(input(),2))[2:])

배운 것: int()에 ,를 찍고 뒤에 숫자를 넣으면 그 진법의 숫자를 받는다는 것

Comments