본문 바로가기
Algorithm/구현

[Python3] 백준 1373번 2진수 8진수

by HANNI하니 2023. 1. 10.

1373번: 2진수 8진수 (브론즈1)

문제

 

1373번: 2진수 8진수

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

www.acmicpc.net

정답

oct, int 함수를 사용하는 문제

내 정답1) 2진수를 10진수로 변환하고, 8진수로 변환하였으나 시간 초과로 오답처리 되었다.

보통 대부분 사람들이 이와 같은 flow로 문제를 해결하려고 한 것을 알 수 있었다.

풀이)

1. 2진수는 자릿수가 1,2,4,8,.. 이기 때문에 처음에 num을 1로 지정해주고 나중에 2씩 곱해준다.

2. 2진수 리스트의 가장 오른쪽 값부터 num 자릿수를 곱해주어 총 합으로 10진수를 구한다.

3. 10진수를 8로 나누어 나머지는 str 형태로 저장해둔다. (str로 하는 이유는 list 인덱싱할 때 join으로 합해주기 위해)

10진수를 8로 나눈 몫을 10진수 값으로 계속 업데이트 해주면서 0이 될때까지 반복해준다.

4. 밑에서부터 올라오기 때문에 reverse해주어 출력했다.

# 내 정답1
n = list(input()) #2진수 입력

#10진수 변환
num = 1
ans = 0
for i in range(len(n)):
    ans += int(n[::-1][i]) * num
    num *= 2

#8진수 변환
ans8 = []

while True:
    aaa = ans%8 # 나머지
    ans = ans//8 # 몫
    if aaa == 0:
        break
    ans8.append(str(aaa))

# 리스트 출력
print(''.join(ans8[::-1]))

 

내 정답2) 2진수를 3자리씩 묶어서 8진수 한 자리로 만들 수 있는 아이디어를 활용했으나 똑같이 시간 초과로 오답처리 되었다.

출처 : https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=brinsonpark&logNo=220685807322

풀이)

1. 앞서서 2진수를 10진수로 바꿔준 것과 비슷한 형식으로 진행한다.

2. 10진수로 바꾼 값을 arr 리스트에 저장해두고, arr 리스트 길이가 3개가 된다면, 즉 2진수 3자리 묶음이 완성된다면, 다시 자릿수와 10진수값을 리셋해주어 0의 상태로 돌아가 2진수를 다시 시작해준다.

이 방식을 2진수의 길이만큼 반복하여 진행한다.

위의 사진 예시로 보면, 111010011(2) -> [1,2,3,0,2,2,1,3,7] 이런식으로 저장된다. 3개 묶음씩 2진수를 10진수 값으로 변환하여 총 합인 마지막 세번째 숫자만 뽑아야 하는 것을 알 수 있다.

3. 그렇기 때문에 새로운 비어있는 리스트 arr2 에 3번째 값만 저장해주는 코딩을 했다.

4. 이를 reverse 해주면 8진수 값이 나온다.

# 내 정답2
n = list(input()) #2진수 입력

# 2진수 3개씩 묶어서 계산하여 8진수로 변환
num = 1
ans = 0
arr = []
arr2 = []

for i in range(len(n)):
    ans += int(n[::-1][i]) * num
    num *= 2
    arr.append(ans)
    if len(arr)%3 == 0:
        num = 1
        ans = 0

cnt = 3
for i in range(len(arr)//3+1):
    arr2.append(str(arr[:cnt][-1]))
    cnt += 3


print(''.join(arr2[::-1]))

 

<내가 생각하지 못한 아이디어>

1. int(a,b)

a 입력값을 b 진법으로 인식한다. b는 디폴트 10이기 때문에 a만 적는다면 자동으로 10진수로 인식한다.

int('0o12', 8)  = 8진수 string 타입을 10진수 integer로 변환

2. oct(x)

정수 x를 입력받아 8진수로 변환하는 함수

8진수임을 맨 앞에 접두사 ' 0o'를 붙여서 표현하기 때문에 숫자만 출력하기 위해선 [2:]로 없애주어야 한다.

oct(int(5,2)) = 2진수 '5'를 10진수로 바꾼 뒤, 8진수로 변환

# 정답

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

 

공부한 내용

oct(int(_,_))

외워두기만 하면 틀릴 일 없다!

 


레퍼런스

  • 다른 풀이 참고
 

[백준] 1373번 파이썬(python) - 2진수 8진수

https://www.acmicpc.net/problem/1373 1373번: 2진수 8진수 첫째 줄에 2진수가 주어진다. 주어지는 수의 길이는 1,000,000을 넘지 않는다. www.acmicpc.net 처음에는 파이썬 자체에 2진수, 8진수와 관련된 내장함수가

oort-cloud.tistory.com

  • 진수 공부
 

수 체계와 진수 변환 (2진법, 8진법, 16진법)

0과 1을 위해서 진수변환을 배워본다. 2진수를 위해서 수 체계 공학에서 배울 수 체계는 2진수, 8진수, 16...

blog.naver.com

 

 

2진수,8진수,16진수의 모든것

사람에겐 3과 5를 더하는 것이 익숙하기 때문에 주어진 수를 이용하여 바로 계산이 가능하지만, 컴퓨터는 그렇지 않다. 컴퓨터는 사람이 계산하는 방식과 다른 원리로 계산을 한다. 이 원리를 이

itbeginner2020.tistory.com

  • 정답 깃허브
 

GitHub - yyeongeun/codingtest: 코딩테스트 공부

코딩테스트 공부. Contribute to yyeongeun/codingtest development by creating an account on GitHub.

github.com

 

댓글