값 n이 주어졌을 때, 1부터 n까지 각 숫자에 대해 10진수(Decimal), 8진수(Octal), 16진수(Hexadecimal), 2진수(Binary) 값을 네 개의 열로 나누어 출력하는 프로그램을 만들어 보겠습니다.
파이썬에서는 문자열 포매팅 시 접두사 d(10진수), o(8진수), X(16진수), b(2진수)를 활용하면 손쉽게 각 진법의 표현을 얻을 수 있습니다.
예시
예를 들어 n = 10이 입력되면 다음과 같은 결과가 출력됩니다.
1 1 1 1 2 2 2 10 3 3 3 11 4 4 4 100 5 5 5 101 6 6 6 110 7 7 7 111 8 10 8 1000 9 11 9 1001 10 12 A 1010
문제 해결 접근 방식
각 열이 깔끔하게 정렬되도록 하기 위해 다음 단계를 따릅니다.
- 먼저, 가장 큰 수인 n의 2진수 표현 길이를 구합니다. 파이썬의
bin()함수는 앞에 '0b' 접두사가 붙은 문자열을 반환하므로, 실제 자릿수는 이 길이에서 2를 뺀 값입니다. 이를 변수 l에 저장합니다. - 1부터 n까지 반복하면서 각 숫자에 대해 다음을 수행합니다.
- 포맷 문자열을 담을 빈 문자열 f를 초기화합니다.
- 진법 지정자 "doXb"의 각 문자 c에 대해:
- f가 이미 비어 있지 않다면, 열 사이 구분을 위해 공백 한 칸을 추가합니다.
- f에 오른쪽 정렬(right-align) 포맷 문자열을 연결합니다. 이때 폭은 l을 문자열로 변환한 값으로 지정하고, 그 뒤에 진법 문자 c를 붙입니다.
- 완성된 포맷 문자열 f에 현재 숫자 i를 네 번 전달하여 한 줄을 출력합니다.
구현 코드
아래는 위 로직을 구현한 파이썬 코드입니다.
def solve(n):
# n의 2진수 표현 길이에서 '0b' 접두사 2글자 제외
l = len(bin(n)) - 2
for i in range(1, n + 1):
f = ""
for c in "doXb":
if f:
f += " "
# 오른쪽 정렬 포맷 문자열 생성 (폭: l)
f += "{:>" + str(l) + c + "}"
print(f.format(i, i, i, i))
n = 10
solve(n)입력
10
출력
1 1 1 1 2 2 2 10 3 3 3 11 4 4 4 100 5 5 5 101 6 6 6 110 7 7 7 111 8 10 8 1000 9 11 9 1001 10 12 A 1010
핵심 포인트 정리
{:>l}형태의 포맷 지정자는 해당 값을 폭 l만큼 오른쪽 정렬하여 출력합니다.- 진법 문자
d,o,X,b를 조합하면 별도의 변환 함수 없이 한 번의 포매팅으로 여러 진법 표현을 얻을 수 있습니다. - 모든 열의 폭을 가장 긴 2진수 자릿수에 맞추기 때문에, 어떤 입력값이 들어와도 열이 어긋나지 않고 정렬됩니다.
이 방식은 진법 변환뿐 아니라, 표 형태로 데이터를 정렬해서 출력해야 하는 다양한 상황에서도 유용하게 응용할 수 있습니다.