나를 기록하다
article thumbnail
반응형

2진수 8진수

시간 제한메모리 제한제출정답맞힌 사람정답 비율
1 초128 MB2841611157918541.056%

문제

2진수가 주어졌을 때, 8진수로 변환하는 프로그램을 작성하시오.

입력

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

출력

첫째 줄에 주어진 수를 8진수로 변환하여 출력한다.

예제 입력 1

11001100

예제 출력 1

314

풀이

1)

# 입력 받기
binary_num = input()

# 앞에서부터 3자리씩 끊어서 8진수로 변환
binary_num = binary_num.zfill(len(binary_num) + (3 - len(binary_num) % 3) % 3)
octal_num = ""

for i in range(0, len(binary_num), 3):
    octal_digit = int(binary_num[i:i+3], 2)
    octal_num += str(octal_digit)

# 결과 출력
print(octal_num)
  • 풀이과정
    1. 입력 받기
    binary_num = input()

    input() 함수를 사용하여 사용자로부터 2진수를 입력받습니다. 입력받은 값은 binary_num 변수에 저장됩니다.

    1. 3자리씩 끊어서 처리하기 위한 준비
    binary_num = binary_num.zfill(len(binary_num) + (3 - len(binary_num) % 3) % 3)

    zfill() 함수를 사용하여 문자열 앞에 필요한 만큼 0을 추가합니다. 이렇게 하면 2진수를 3자리씩 끊어 처리할 때 나머지 부분을 쉽게 처리할 수 있습니다.

    • 추가설명

      마지막에 % 3을 한 번 더 해주는 이유는 이미 3의 배수인 경우에는 앞에 0을 추가할 필요가 없기 때문입니다.

      (3 - len(binary_num) % 3) % 3 이 부분을 살펴보면, len(binary_num) % 3가 3의 배수인 경우(즉, 0인 경우)에는 (3 - 0) % 3이 되어 결과는 0이 됩니다. 이 경우, zfill() 함수에 전달되는 값은 원래 문자열의 길이와 동일하게 되어, 실제로는 앞에 0을 추가하지 않게 됩니다.

      예를 들어, binary_num이 '110100'이라면, len(binary_num)은 6이고, (3 - len(binary_num) % 3) % 3는 0입니다. 따라서 binary_num.zfill(6)이 되어 문자열에는 변화가 없고 '110100'이 그대로 유지됩니다.

      이렇게 % 3을 한 번 더 해주는 것은, 원래 2진수 문자열의 길이가 이미 3의 배수인 경우에 앞에 0을 추가하지 않기 위한 처리입니다.

    1. 2진수를 8진수로 변환
    octal_num = ""
    
    for i in range(0, len(binary_num), 3):
        octal_digit = int(binary_num[i:i+3], 2)
        octal_num += str(octal_digit)

    for 반복문을 사용하여 binary_num의 길이를 3씩 증가시키면서 인덱스를 만듭니다. 이렇게 하면 2진수를 3자리씩 끊어 처리할 수 있습니다. 그리고 int() 함수를 사용하여 2진수를 10진수로 변환한 뒤, 이를 octal_num 문자열에 추가합니다.

    1. 결과 출력
    print(octal_num)

    마지막으로 print() 함수를 사용하여 변환된 8진수를 출력합니다.

    이러한 단계를 거쳐 주어진 2진수를 8진수로 변환하는 파이썬 코드를 완성할 수 있습니다.

2)

s = input()
n = len(s)
ans = ''
if n%3 == 1:
    print(s[0], end='')
elif n%3 == 2:
    print((ord(s[0])-ord('0'))*2 + ord(s[1])-ord('0'), end='')
for i in range(n%3, n, 3):
    print((ord(s[i])-ord('0'))*4 + (ord(s[i+1])-ord('0'))*2 + (ord(s[i+2])-ord('0')), end='')
  • 풀이과정

    이 코드는 주어진 2진수를 8진수로 변환하는 또 다른 방법을 구현한 것입니다. 각 부분별로 설명하겠습니다.

    1. 입력 받기
    s = input()

    input() 함수를 사용하여 사용자로부터 2진수를 입력받습니다. 입력받은 값은 s 변수에 저장됩니다.

    1. 문자열 길이 구하기
    n = len(s)

    len() 함수를 사용하여 입력받은 2진수 문자열의 길이를 구하고, 이를 n 변수에 저장합니다.

    1. 결과를 저장할 변수 초기화
    ans = ''

    변환된 8진수를 저장할 변수 ans를 초기화합니다. 여기서는 실제로 사용되지 않았습니다.

    1. 첫 번째 8진수 자릿수 구하기
    if n % 3 == 1:
        print(s[0], end='')
    elif n % 3 == 2:
        print((ord(s[0])-ord('0'))*2 + ord(s[1])-ord('0'), end='')

    입력받은 2진수 문자열의 길이를 3으로 나눈 나머지에 따라 첫 번째 8진수 자릿수를 구합니다.

    • 나머지가 1인 경우: 문자열의 첫 번째 숫자가 첫 번째 8진수 자릿수가 됩니다.
    • 나머지가 2인 경우: 문자열의 첫 두 숫자를 계산하여 첫 번째 8진수 자릿수를 구합니다.

    print() 함수의 end 파라미터를 빈 문자열로 설정하여 줄바꿈 없이 출력합니다.

    1. 나머지 8진수 자릿수 구하기
    for i in range(n % 3, n, 3):
        print((ord(s[i])-ord('0'))*4 + (ord(s[i+1])-ord('0'))*2 + (ord(s[i+2])-ord('0')), end='')

    for 반복문을 사용하여 2진수 문자열을 3자리씩 끊어서 처리합니다. 각 3자리를 계산하여 8진수 자릿수를 구하고 출력합니다.

    ord() 함수를 사용하여 문자열의 각 문자를 ASCII 코드로 변환한 뒤, 해당 자릿수에 맞는 가중치를 곱하여 8진수 값을 계산합니다. 마찬가지로 print() 함수의 end 파라미터를 빈 문자열로 설정하여 줄바꿈 없이 출력합니다.

    이 코드를 사용하면 주어진 2진수를 8진수로 변환할 수 있습니다.


Uploaded by N2T

반응형
profile

나를 기록하다

@prao

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

profile on loading

Loading...