250x250
728x90
1. 문제 - 1373번
2. 접근법
1) 내장 함수
파이썬에서는 진법 변환이 가능한 내장 함수를 제공하기에 매우 간단하게 풀 수 있다.
8진법의 경우, oct 함수를 사용하면 된다.
<정답 코드 1>
print(oct(int(input(),2))[2:])
2) 진법 변환 원리를 코드로 구현
2진수의 세자리가 8진수의 한 자리가 된다는 원리에서 착안.
예를 들어,
문제에서 주어진 2진수 11001100을 끊어보면 11 / 001 / 100 이며 이걸 8진수로 나타내면 314가 된다.
(계산은 0*2^2+1*2^1+1*2^0 / 0*2^2+0*2^1+1*2^0 / 1*2^2+0*2^1+0*2^0)
이런 원리를 코드로 구현하면 된다고 판단했다.
<정답 코드 2>
import sys
input = sys.stdin.readline
def bin_to_oct(binary):
oct = ""
while True:
k = 0
oct_k = []
if len(binary) > 2:
for num in reversed(binary[-3:]):
oct_k.append(int(num)*(2**k))
k += 1
oct += f"{sum(oct_k)}"
del binary[-3:]
else:
for num in reversed(binary):
oct_k.append(int(num)*(2**k))
k += 1
oct += f"{sum(oct_k)}"
break
return int(oct[::-1])
bin = ",".join(input()).split(",")[:-1]
print(bin_to_oct(bin))
이런 방식으로 풀 경우, 주의점이 몇가지 있다.
첫째, 입력받은 2진수를 함수에 넣을 때는 인덱싱이 가능하도록 배열해줘야 한다.
-> 입력받은 정수 그대로 시퀀스 자료형으로 만들면 '11001100'과 같이 되어 인덱싱이 불가능하므로,
join메서드로 콤마를 넣어주고, 그 콤마를 기준으로 다시 split으로 나눠주면, 각 자리 숫자가 하나씩 배열된다.
둘째, 가장 작은수 부터 8진수로 변환해줘야 하므로 인덱싱을 역순으로 하던지, 처음부터 순서를 뒤집어서 입력해줘야 한다.
전체 프로세스는 다음과 같다.
이진수 입력 -> join, split으로 인덱싱 가능한 시퀀스 자료형 변환 -> 순서 뒤집기(reversed, sort(reversed=True), [::-1] 등 활용) -> 함수에 매개변수로 넣고 호출 -> 결과 값 리턴 -> 출력
728x90
'Data Science > PS (Python)' 카테고리의 다른 글
[백준 Python] - 1929 소수 구하기 '에라토스테네스의 체' (0) | 2024.04.07 |
---|---|
[백준 Python] - '1978 소수 찾기' 쉽게 풀기! (0) | 2024.04.07 |
[백준 Python] - 11576 Base Conversion (0) | 2024.04.07 |
[백준 Python] - 2089 -2진수 변환 (0) | 2024.04.06 |
[백준 Python] - 1212 8진수 2진수 변환 (0) | 2024.04.06 |