728x90

문제

다음과 같이 Encoding 을 한다.

1. 우선 24비트 버퍼에 위쪽(MSB)부터 한 byte씩 3 byte의 문자를 집어넣는다.
2. 버퍼의 위쪽부터 6비트씩 잘라 그 값을 읽고, 각각의 값을 아래 [표-1] 의 문자로 Encoding 한다.

 

 

입력으로 Base64 Encoding 된 String 이 주어졌을 때, 해당 String 을 Decoding 하여, 원문을 출력하는 프로그램을 작성하시오.

 

제약 사항

문자열의 길이는 항상 4의 배수로 주어진다.
그리고 문자열의 길이는 100000을 넘지 않는다.

 

입력

입력은 첫 줄에 총 테스트 케이스의 개수 T가 온다.
다음 줄부터 각 테스트 케이스가 주어진다.
테스트 케이스는 Encoding 된 상태로 주어지는 문자열이다.

 

출력

테스트 케이스 t에 대한 결과는 “#t”을 찍고, 한 칸 띄고, 정답을 출력한다.
(t는 테스트 케이스의 번호를 의미하며 1부터 시작한다.)

 

예제

[입력] [출력]
10
TGlmZSBpdHNlbGYgaXMgYSBxdW90YXRpb24u
U3VzcGljaW9uIGZvbGxvd3MgY2xvc2Ugb24gbWlzdHJ1c3Qu
VG8gZG91YnQgaXMgc2FmZXIgdGhhbiB0byBiZSBzZWN1cmUu
T25seSB0aGUganVzdCBtYW4gZW5qb3lzIHBlYWNlIG9mIG1pbmQu
QSBmdWxsIGJlbGx5IGlzIHRoZSBtb3RoZXIgb2YgYWxsIGV2aWwu
#1 Life itself is a quotation.
#2 Suspicion follows close on mistrust.
#3 To doubt is safer than to be secure.
#4 Only the just man enjoys peace of mind.
#5 A full belly is the mother of all evil.
...

 

문제 해결 방법

  • 문제에서 제시된대로 인코딩(Encoding)디코딩(Decoding) 작업을 해준 후 결과값을 출력해주는 문제이다.
  • 10진수를 2진수로 바꿀 때는 @bin()@ 함수를, @N@자리의 2진수를 만들 때(남는 부분은 @0@으로 채울 때)는 @zfill(N)@ 함수를 사용한다.
  • 인코딩 작업은 아래와 같은 과정으로 진행된다.
1. 입력을 받은 문자열 안의 각각의 요소를 테이블의 값(10진수)으로 변경하기
2. 각각의 테이블의 값(10진수)을 6자리의 2진수로 변경 후 합치기 (빈 공간은 0으로 채우기)
def encode(input_string):
    values_table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
    output_string = ""
    
    for ch in input_string:
        value_table = ""

        # 입력 문자열의 각 요소를 테이블의 값으로 바꾸기
        for idx, item in enumerate(values_table):
            if item == ch:
                value_table = idx
                break
        
        # 10진수를 2진수로 바꾸기 & 앞의 0b 문자 지우기
        value_binary = bin(value_table)[2:]

        # 6자리로 만들고, 빈 공간은 0으로 채우기
        value_binary = value_binary.zfill(6)

        # 2진수들을 합치기
        output_string += value_binary

    return output_string

 

  • 디코딩 작업은 아래와 같은 과정으로 진행된다.
1. 2진수 문자열에서 8자리씩 뽑아내기
2. 뽑아낸 8자리 2진수를 10진수로 바꾸기
3. 10진수를 문자로 바꾼 후 합치기
def decode(input_string, digit):
    output_string = ""

    for i in range(0, len(input_string), digit):
        binary_value = input_string[i:i + digit]    # 8자리 뽑아내기

        # 2진수를 10진수로 바꾸기
        decimal_value = int(binary_value, 2)

        # 10진수를 문자로 바꾸기
        char_value = chr(decimal_value)

        # 문자 합치기
        output_string += char_value
    
    return output_string

 

코드

# 인코딩 작업
## 1. 입력받은 문자열 안의 각각의 요소를 테이블의 값(10진수)으로 변경하기
## 2. 각각의 테이블의 값(10진수)을 6자리의 2진수로 변경 후 합치기 (빈 공간은 0으로 채우기)
def encode(input_string):
    values_table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
    output_string = ""
    
    for ch in input_string:
        value_table = ""

        # 입력 문자열의 각 요소를 테이블의 값으로 바꾸기
        for idx, item in enumerate(values_table):
            if item == ch:
                value_table = idx
                break
        
        # 10진수를 2진수로 바꾸기 & 앞의 0b 문자 지우기
        value_binary = bin(value_table)[2:]

        # 6자리로 만들고, 빈 공간은 0으로 채우기
        value_binary = value_binary.zfill(6)

        # 2진수들을 합치기
        output_string += value_binary

    return output_string

# 디코딩 작업
## 1. 2진수 문자열에서 8자리씩 뽑아내기
## 2. 뽑아낸 8자리 2진수를 10진수로 바꾸기
## 3. 10진수를 문자로 바꾼 후 합치기
def decode(input_string, digit):
    output_string = ""

    for i in range(0, len(input_string), digit):
        binary_value = input_string[i:i + digit]    # 8자리 뽑아내기

        # 2진수를 10진수로 바꾸기
        decimal_value = int(binary_value, 2)

        # 10진수를 문자로 바꾸기
        char_value = chr(decimal_value)

        # 문자 합치기
        output_string += char_value
    
    return output_string


T = int(input())

for test_case in range(1, 1 + T):
    S = input()

    print(f"#{test_case} {decode(encode(S), 8)}")

 

참고

  • 난이도: D2
728x90