알고리즘/이것저것

[swea] 1928번: Base64 Decoder - 파이썬(python)

아뵹젼 2022. 10. 31.

출처 : https://swexpertacademy.com/main/solvingProblem/solvingProblem.do

 

 

Encoding 순서 는 다음과 같다.

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

 

문제 는 다음과 같다.

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

 

즉, 인코딩된 string 을 인코딩 과정의 역순으로 진행하여, 원문을 출력해야 한다.

 

Step 1

먼저, input 의 각 문자는 어떤 값을 표1의 문자로 인코딩 한 것이다.

따라서 문자를 표에 있는 값으로 변경하면 된다.

또한, 값을 6비트씩 잘라 값을 읽은 것이므로, 값을 6비트 2진수 문자열로 변경해야 한다.

ex) T : 19 -> 010011 / G : 6 -> 000110

이렇게 모든 각각의 문자에 대해 위와 같은 과정을 거치면, 이진수 문자열이 이어진 형태가 될 것이다.

ex) 010011000110 ....

 

Step 2

이진수 문자열이 이어진 형태는 원래 한 byte 씩 문자를 집어넣은 결과값이다.

따라서 이진수 문자열을 8자리씩 끊어 해당값을 문자로 변경해야 한다.

ex) 01001100 / 0110...

-> 01001100 을 아스키코드로 변경하면 L이 된다.

 

 

 

나의 코드

encode = ["A","B","C","D","E","F","G","H","I","J","K","L","M",
"N","O","P","Q","R","S","T","U","V","W","X","Y","Z",
"a","b","c","d","e","f","g","h","i","j","k","l","m",
"n","o","p","q","r","s","t","u","v","w","x","y","z",
"0","1","2","3","4","5","6","7","8","9","+","/"]

T = int(input())
for t in range(1,T+1) :
    s = input()
    length = len(s)
    tmp = ''
    for i in range(len(s)) :
        num = encode.index(s[i])
        bin_num = bin(num)[2:]
        while len(bin_num) < 6 :
            bin_num = "0" + bin_num
        tmp += bin_num

    answer = ''
    for i in range(length*6//8) :
        c = int(tmp[i*8:i*8+8],2)
        answer += chr(c)
        
    print(f"#{t} {answer}")

댓글