haju__log

[python][백준/BOJ] 1373번 : 2진수 8진수 본문

BOJ_백준

[python][백준/BOJ] 1373번 : 2진수 8진수

haju 2023. 7. 11. 17:38
반응형

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

 

1373번: 2진수 8진수

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

www.acmicpc.net

 

첫 번째 문제 풀이

  • 2진수 ➡ 10진수 ➡ 8진수로 변화하려고 했지만 시간초과! (뭔가 그럴 것 같았음 ㅎㅎ)

✅ 시간 초과 나온 코드

import sys
n=list(map(int,sys.stdin.readline().strip()))
result=0
leng=len(n)

for i in range(leng):
    result+=(2**i) * n[leng-1-i]

na=[]
while result!=0:
    na.append(result%8)
    result//=8
na.reverse()

for i in na :
    print(i,end='')

 

 

 

두 번째 문제 풀이

  • 2진수 숫자를 각 자리별로 리스트에 저장한다.
  • 3개씩 끊어서 저장한다. (만약 3개씩 안끊기고 나머지가 있는 경우는 따로 생각해야함)
  • 3개의 숫자를 2^2 , 2^1, 2^0 로 연산하여 각 자리를 구한다.

틀린 코드

  • 반례 111인 경우
import sys
n=list(map(int,sys.stdin.readline().strip()))
leng=len(n)//3
cutlist=[] #3개씩 자른 숫자를 저장할 리스트
tmp=[] #임시 리스트
flag=0 #3개씩 자르기 위한 index
n.reverse() #맨 뒷자리부터 2^0이기 때문에 편하게 계산하기 위해서 거꾸로 정렬했다.

for i in range(leng*3): #예제가 8자리이면 3의 배수길이만큼만 출력하기위해 길이를 임의로 설정(6개까지만 가능하도록)
    if flag==2: #숫자가 3개인 걸 확인했다면
        tmp.append(n[leng-1-i])
        tmp.reverse() #원래 대로 저장하기 위해 다시 거꾸로 정렬하고
        cutlist.append(tmp) #임시리스트에 저장된 값을 cutlist에 저장
        tmp=[] #임시리스트 비우기
        flag=0 #index값도 초기화
    else: #만약 숫자가 3개가 안되었으면, 그냥 임시리스트에 추가함
        tmp.append(n[leng-1-i])
        flag+=1

#나머지 저장못한 값들을 추가해주는 과정
tmp=n[leng*3:]
if len(tmp)==1: #tmp 원소가 1개라면 0을 두 번 추가
    tmp.append(0)
    tmp.append(0)
elif len(tmp)==2: #tmp 원소가 2개라면 0 한 번 추가
    tmp.append(0)

tmp.reverse()
cutlist.append(tmp)
cutlist.reverse()

result=[] #result는 최종 8진수로 변환한 값을 저장할 리스트
for i in range(len(cutlist)):
    tmp=0
    for j in range(3):
        tmp+=cutlist[i][j]* 2**(2-j)
    result.append(tmp)
#출력하기
for i in result:
    print(i,end='')

cutlist의 값이 [[1,1,1]]

 

최종 수정한 코드

  • 위의 코드에서 초기값 n리스트를 reverse 정렬을 해줬으면 인덱스를 0부터 확인해야하는데, 거꾸로 확인하니 오류가 나는 것이었다! 
import sys
n=list(map(int,sys.stdin.readline().strip()))
leng=len(n)//3
cutlist=[] #3개씩 자른 숫자를 저장할 리스트
tmp=[] #임시 리스트
flag=0 #3개씩 자르기 위한 index
n.reverse() #맨 뒷자리부터 2^0이기 때문에 편하게 계산하기 위해서 거꾸로 정렬했다.

for i in range(leng*3): #예제가 8자리이면 3의 배수길이만큼만 출력하기위해 길이를 임의로 설정(6개까지만 가능하도록)
    if flag==2: #숫자가 3개인 걸 확인했다면
        tmp.append(n[i])
        tmp.reverse() #원래 대로 저장하기 위해 다시 거꾸로 정렬하고
        cutlist.append(tmp)  #임시리스트에 저장된 값을 cutlist에 저장
        tmp=[] #임시리스트 비우기
        flag=0 #index값도 초기화
    else: #만약 숫자가 3개가 안되었으면, 그냥 임시리스트에 추가함
        tmp.append(n[i])
        flag+=1

#나머지 저장못한 값들을 추가해주는 과정
if len(n[leng*3:])!=0: #만약 남은 n리스트값이 있다면 진행하고 아니라면 pass
    tmp=n[leng*3:]
    if len(tmp)==1: #tmp 원소가 1개라면 0을 두 번 추가
        tmp.append(0)
        tmp.append(0)
    elif len(tmp)==2: #tmp 원소가 2개라면 0 한 번 추가
        tmp.append(0)
    tmp.reverse()
    cutlist.append(tmp)
cutlist.reverse()

result=[] #result는 최종 8진수로 변환한 값을 저장할 리스트
for i in range(len(cutlist)):
    tmp=0
    for j in range(3):
        tmp+=cutlist[i][j]* 2**(2-j)
    result.append(tmp)
#출력하기
for i in result:
    print(i,end='')

 

✅ 세 번째 문제풀이 - 함수를 이용

✅ 짧은 코드 (대박적,,,)

import sys

s=sys.stdin.readline().strip()
sn=int(s,2)
print(format(sn,'o'))

 

✅ 위에 제출한 코드와 짧은 코드의 시간차이 비교!!

  • 앞으로 함수를 이용하자 ㅎㅎ NEW⭐

반응형