haju__log
[python][백준/BOJ] 1373번 : 2진수 8진수 본문
반응형
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='')
✅ 최종 수정한 코드
- 위의 코드에서 초기값 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⭐
반응형
'BOJ_백준' 카테고리의 다른 글
[python][백준/BOJ] 2751번 : 수 정렬하기 2 (0) | 2023.07.18 |
---|---|
[python][백준/BOJ] 2750번 : 수 정렬하기 (0) | 2023.07.18 |
[python][백준/BOJ] 10989번 : 수 정렬하기 3 (메모리 초과 해결) (0) | 2023.06.12 |
[python][백준/BOJ] 10815번 : 숫자 카드 (0) | 2023.06.12 |
[python][백준/BOJ] 1934번 : 최소공배수 (0) | 2023.03.10 |