본문 바로가기

Study/Algorithm 문제풀이

[SW Expert Academy] 1928. Base64 Decoder(using python)

728x90
반응형

* 문제의 저작권은 SW Expert에 있습니다.

swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PR4DKAG0DFAUq&categoryId=AV5PR4DKAG0DFAUq&categoryType=CODE&problemTitle=base&orderBy=FIRST_REG_DATETIME&selectCodeLang=ALL&select-1=&pageSize=10&pageIndex=1

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

[ 문 제 ]

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

표 1

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

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

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

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

 

입력과 출력 예시

[ 전체 코드 ]

baseAZ = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
base = {i:ord(i)-65 for i in baseAZ}
for a in baseAZ.lower():
    base[a] = ord(a)-71
for n in range(0, 10):
    base[str(n)] = ord(str(n))+4
base["+"] = 62
base["/"] = 63

T = int(input())
for i in range(1, T+1):
    bit = input()
    result = ""
    for j in range(0, len(bit), 4):
        temp = ""
        for k in bit[j:j+4]:
            temp += format(base[k],'b').zfill(6)
        for m in range(0, len(temp), 8):
            result += chr(int(temp[m:m+8], 2))
    print(f"#{i}", result)

반응형

표1에 있는 걸로 변환하면 되는 것인가 착각을 하고 접근 했던 문제이다..

 

이 문제를 풀기 위해서는 base64에 대한 개념부터 알고 가야한다.

더보기

< Base64 >

컴퓨터 분야에서 쓰이는 Base 64 (베이스 육십사)란 8비트 이진 데이터(예를 들어 실행 파일이나, ZIP 파일 등)를 문자 코드에 영향을 받지 않는 공통 ASCII 영역의 문자들로만 이루어진 일련의 문자열로 바꾸는 인코딩 방식을 가리키는 개념이다.

원래 Base 64를 글자 그대로 번역하여 보면 64진법이란 뜻이다. 특별히 64진법이 컴퓨터에서 흥미로운 것은, 64가 2의 제곱수(64 = 26)이며, 2의 제곱수들에 기반한 진법들 중에서 화면에 표시되는 ASCII 문자들을 써서 표현할 수 있는 가장 큰 진법이기 때문이다. 즉, 다음 제곱수인 128진법에는 128개의 기호가 필요한데 화면에 표시되는 ASCII 문자들은 128개가 되지 않는다.

그런 까닭에 이 인코딩은 전자 메일을 통한 이진 데이터 전송 등에 많이 쓰이고 있다. Base 64에는 어떤 문자와 기호를 쓰느냐에 따라 여러 변종이 있지만, 잘 알려진 것은 모두 처음 62개는 알파벳 A-Z, a-z와 0-9를 사용하고 있으며 마지막 두 개를 어떤 기호를 쓰느냐의 차이만 있다.

Man을 Base64-Encoded하는 과정

 

위의 예시와 같이, 첫번째 입력 문자열을 가지고 역순으로 예를 들어보고, 코드 설명을 해보겠다.

 

첫번째 문자열 예시 : TGlmZSBpdHNlbGYgaXMgYSBxdW90YXRpb24u 

 

문자열 예시

 

먼저 입력 받은 문자열을 4개 단위로 나누어 주고, base64에서 Index를 읽어 준다. 그리고 그것을 2진수로 바꿔준 후 하나의 문자열로 합쳐준다. → 010011000110100101100110

 

그 다음 다시 8자리로 나누어 준 뒤, 8자리에 맞는 숫자로 변환하고, chr() 함수를 통해 ASCII 코드로 변환한다.

 

zfill() : 2진수로 변환시 해당 자리수 만큼 '0'을 채우기 위해서 사용하였다.

chr() : 숫자에 맞는 아스키코드를 반환한다.

 

728x90
반응형