[BOJ] 1373: 2진수 8진수

이슬비·2022년 6월 16일
0

Algorithm

목록 보기
43/110
post-thumbnail

numpy를 못 쓰게 하다니... 분하다...

1373: 2진수 8진수


🙋 2진수 & 8진수

  • 2진수: 2를 기반으로 하는 숫자체계 => 0, 1
  • 8진수: 8을 기반으로 하는 숫자체계 => 0, 1, 2, 3, 4, 5, 6, 7

2진수에서 바로 8진수로 변환하는 방법은 아래의 블로그를 참고하면 도움이 될 것이다.
https://m.blog.naver.com/icbanq/221727893563


1. 내 풀이 1: 실패

import sys
import numpy as np

binary = list(map(int, sys.stdin.readline().strip()))
if len(binary) % 3 != 0:
    while len(binary) % 3 !=0:
        binary.insert(0, 0)

binary = np.array(binary).reshape(-1, 3)
octal = ''

for i in range(len(binary)):
    octal += str(binary[i][0]*4 + binary[i][1]*2 + binary[i][2]*1)
        
print(int(octal))

일단 답은 제대로 도출된다. 하지만...

numpy를 쓸 수 없는 환경이기에, 속도는 빠르더라도 틀린 답이 되었다. 하지만 답은 맞으니! 한 번 설명을 해보자.

일단 2진수에서 8진수로 변환하는 과정을 간단하게 설명하자면, 2진수로 표현된 숫자를 3개씩 쪼갠다. 만약 3으로 떨어지지 않는 길이라면 0을 추가한다. 그 후에는 차례차례 1,2,4를 곱해주면 된다.

import sys
import numpy as np

binary = list(map(int, sys.stdin.readline().strip()))
if len(binary) % 3 != 0:
    while len(binary) % 3 !=0:
        binary.insert(0, 0)

이 부분이 길이가 3보다 클 때 0을 하나씩 추가해주는 로직이다.

그 후에는 1, 2, 4를 곱해주는 부분을 수월하게 하기 위해 해당 리스트를 (n,3)의 2차원 리스트로 만들어준다. (이때 n은 len(리스트) // 3)
나는 이 과정에서 numpy의 reshape를 사용하였다.

binary = np.array(binary).reshape(-1, 3)

reshape에 -1을 지정하면 "나는 행의 크기는 모르겠고~, 요소는 3개씩 들어가게 해주세요!"의 의미라, 알아서 행이 만들어지게 된다.

octal = ''

for i in range(len(binary)):
    octal += str(binary[i][0]*4 + binary[i][1]*2 + binary[i][2]*1)
        
print(int(octal))

그 후에는 야무지게 하나씩 알맞게 곱해줘서 octal(8진수)를 출력하면 된다. numpy + python의 속도는 상당하다고 하는데, 시간을 확인해볼 수 없어서 아쉽긴 하다.

2. 내 풀이 2: 성공

import sys

binary = list(map(int, sys.stdin.readline().strip()))
if len(binary) % 3 != 0:
    while len(binary) % 3 !=0:
        binary.insert(0, 0)

# ================= 달라진 부분 ===================
binary_list = []
temp = []
for i in range(0, len(binary), 3):
    for j in binary[i:i+3]:
        temp.append(j)
    binary_list.append(temp)
    temp = []
# ===============================================

octal = ''
for i in range(len(binary_list)):
    octal += str(binary_list[i][0]*4 + binary_list[i][1]*2 + binary_list[i][2]*1) 
print(int(octal))

전반적인 과정은 똑같다. 하지만 numpy의 reshape를 사용한 부분을 for문을 이용해서 구현해보았다.

3. 다른 풀이

충격 그 자체... 파이썬에 관련 내장함수가 있다...! 엄청나다...
참고한 블로그는 아래와 같다.
https://oort-cloud.tistory.com/entry/%EB%B0%B1%EC%A4%80-1373%EB%B2%88-%ED%8C%8C%EC%9D%B4%EC%8D%ACpython-2%EC%A7%84%EC%88%98-8%EC%A7%84%EC%88%98

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

생각보다 파이썬... 더 좋다는 걸 깨달았다...

오늘도 신기한 (오늘은 진짜 신기했음) 알고리즘의 세계... 끝.

profile
정말 알아?

0개의 댓글