[백준 Python] - 1373 2진수 8진수 변환

250x250
728x90

1. 문제 - 1373번

2. 접근법

1) 내장 함수

파이썬에서는 진법 변환이 가능한 내장 함수를 제공하기에 매우 간단하게 풀 수 있다.
8진법의 경우, oct 함수를 사용하면 된다.

 <정답 코드 1>

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

2) 진법 변환 원리를 코드로 구현

2진수의 세자리가 8진수의 한 자리가 된다는 원리에서 착안.

예를 들어,
문제에서 주어진 2진수 11001100을 끊어보면 11 / 001 / 100 이며 이걸 8진수로 나타내면 314가 된다.
(계산은 0*2^2+1*2^1+1*2^0 / 0*2^2+0*2^1+1*2^0 / 1*2^2+0*2^1+0*2^0)

이런 원리를 코드로 구현하면 된다고 판단했다.

 <정답 코드 2>

import sys
input = sys.stdin.readline

def bin_to_oct(binary):

    oct = ""
    while True:
        k = 0
        oct_k = []
        if len(binary) > 2:
            for num in reversed(binary[-3:]):
                oct_k.append(int(num)*(2**k))
                k += 1
            oct += f"{sum(oct_k)}"
            del binary[-3:]
        else:
            for num in reversed(binary):
                oct_k.append(int(num)*(2**k))
                k += 1
            oct += f"{sum(oct_k)}"
            break

    return int(oct[::-1])

bin = ",".join(input()).split(",")[:-1]

print(bin_to_oct(bin))

이런 방식으로 풀 경우, 주의점이 몇가지 있다.

첫째, 입력받은 2진수를 함수에 넣을 때는 인덱싱이 가능하도록 배열해줘야 한다.
-> 입력받은 정수 그대로 시퀀스 자료형으로 만들면 '11001100'과 같이 되어 인덱싱이 불가능하므로,
join메서드로 콤마를 넣어주고, 그 콤마를 기준으로 다시 split으로 나눠주면, 각 자리 숫자가 하나씩 배열된다.

둘째, 가장 작은수 부터 8진수로 변환해줘야 하므로 인덱싱을 역순으로 하던지, 처음부터 순서를 뒤집어서 입력해줘야 한다.

전체 프로세스는 다음과 같다.
이진수 입력 -> join, split으로 인덱싱 가능한 시퀀스 자료형 변환 -> 순서 뒤집기(reversed, sort(reversed=True), [::-1] 등 활용) -> 함수에 매개변수로 넣고 호출 -> 결과 값 리턴 -> 출력

728x90

댓글

Designed by JB FACTORY