공부하기/백준

[Python] 백준 풀기 1373 - 2진수 8진수

XEV 2022. 11. 24. 20:42

파이썬 백준 1373번

브론즈1

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

 

1373번: 2진수 8진수

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

www.acmicpc.net

 

 

 

 

 

문제 보기

분류: 수학 문자열

 

 

 

 

 

문제 풀기

2진수를 3자리씩 묶어 8진수로 변환하는 방법을 사용하였다.

 

https://www.rapidtables.com/convert/number/binary-to-octal.html

 

Binary to Octal Converter

From Binary Decimal Octal Hexadecimal Text To Binary Decimal Octal Hexadecimal Text

www.rapidtables.com

 

 

입력받은 2진수를 문자로 리스트에 저장하고 이를 3개씩 꺼내어 그 2진수 자리에 상응하는 1, 2, 4 를 곱하고 더하여 8진수를 각각 형성한다. 이 합을 매번 빈 리스트에 저장하여 출력하였다.

 

 

 

 

 

코드 보기

import sys
inputdata = sys.stdin.readline

def fnBinaryToOctalNumber(binary_number):
    ## 입력받은 2진수의 길이를 저장
    b_len = len(binary_number)
    # num_ls = [0] * 1_000_000          # 런타임 에러 (IndexError)
    ## 0으로 초기화된 빈 리스트를 생성
    ## 2진수를 3개씩 끊어 활용을 하기 위해 빈 공간을 채울 +3을 추가함.
    num_ls = [0] * (b_len + 3)
    
    ## 입력받은 2진 문자를 빈 리스트 num_ls의 낮은 자리부터 index 앞쪽에 저장
    i = b_len - 1
    for b in binary_number:
        num_ls[i] = b
        i -= 1
    print(num_ls)           # test print
    
    ## 3개씩 묶어 for loop을 돌리는데 loop 횟수 문제를 해결하기 위해 조건에 따라 달리함
    if b_len % 3 == 0:
        floop = b_len // 3
    elif b_len % 3 != 0:
        floop = b_len // 3 + 1
    
    ## 8진수를 저장할 octal_ls를 만듬
    ## 3개씩 묶음의 자릿수에 따라 2 -> 8 변환시 1, 2, 4를 곱해줌
    ## 그리고 그 합을 octal_ls 에 순차적으로 저장
    octal_ls = []
    for j in range (floop):
        o_sum, o8, o88, o888 = 0, 0, 0, 0
        o8 = 1 * int(num_ls[j * 3])
        o88 = 2 * int(num_ls[j * 3 + 1])
        o888 = 4 * int(num_ls[j * 3 + 2])
        o_sum = o8 + o88 + o888
        octal_ls.append(o_sum)
    print(octal_ls)         # test print
    
    return octal_ls


if __name__ == "__main__":
    ## 입력 숫자를 문자로 변환하여 입력 받음. 빈 리스트를 생성하여 순서를 뒤바꿔 저장할 예정
    binary_number = str(inputdata().strip())
    
    ## 2진->8진 변환 함수를 들어갔다온 결과를 순서에 맞게 출력
    result = fnBinaryToOctalNumber(binary_number)
    for i in range (len(result), 0, -1):
        print(result[i - 1], end='')



# 11001100

# ['0', '0', '1', '1', '0', '0', '1', '1', 0, 0, 0]
# [4, 1, 3]

# 314

 

 

 

 

 

추가 하기

숫자를 분할하여 리스트에 저장하는 것을 자꾸 간과하는것 같다. 정답을 제출하고 나니 왜 돌아갔을까 생각함.

 

list (map (int, str (number))

import sys
inputdata = sys.stdin.readline


ls = list(map(int, str(inputdata()).strip()))
print(ls)



# 123
# [1, 2, 3]

 

 

[int (i) for i in str(number)]

import sys
inputdata = sys.stdin.readline


ls = [int(i) for i in str(inputdata().strip())]
print(ls)



# 123
# [1, 2, 3]