2 분 소요

1928.Base64 Decoder

문제

우선 Encoding을 아래와 같이 해줍니다.

  1. 24비트 버퍼 위쪽(MSB)부터 한 byte씩 3byte의 문자를 집어 넣습니다.
  2. 버퍼의 위쪽부터 6비트씩 잘라 그 값을 읽고, 각각의 값을 아래 표의 문자로 Encoding 합니다.
문자 문자 문자 문자
0 A 16 Q 32 g 48 w
1 B 17 R 33 h 49 x
2 C 18 S 34 i 50 y
3 D 19 T 35 j 51 z
4 E 20 U 36 k 52 0
5 F 21 V 37 l 53 1
6 G 22 W 38 m 54 2
7 H 23 X 39 n 55 3
8 I 24 Y 40 o 56 4
9 J 25 Z 41 p 57 5
10 K 26 a 42 q 58 6
11 L 27 b 43 r 59 7
12 M 28 c 44 s 60 8
13 N 29 d 45 t 61 9
14 O 30 e 46 u 62 +
15 P 31 f 47 v 63 /

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

제약 사항

문자열의 길이는 항상 4의 배수로 주어집니다. 그리고 문자열의 길이는 100,000을 넘지 않습니다.


생각해보기

일단 문제를 읽었을때, 바로 이해가 되지는 않습니다. ψ(`∇´)ψ

입력출력을 보며 이해 해보겠습니다.

입력</br>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.

누군가 적어 놓은 문제 요약을 보니 입력을 숫자로 변환하고 각 숫자를 6자리 이진수로 표현한 다음, 이 이진수들을 한 줄로 쭉 이어 붙입니다. 그리고 한 줄로 이어진 이진수들을 8자리씩 끊어서 십진수로 바꿉니다. 그리고 각각의 십진수를 아스키 코드로 변환합니다.

처음에는 무슨소리인가 싶었는데 말하자면 이런 상황입니다.

어떤 문자가 주어졌을때, 이를 24비트에 3글자를 넣는다고 했으니, 8비트에 한 글짜의 값을 담는 것 입니다. 이는 아스키코드고 맨 앞비트는 양수음수를 말하는 것입니다. 그러면 8비트 중 7비트의 값을 찾아 나열합니다.

예를 들어 Life라면, 이들의 아스키 코드 값을 찾은 후 이진수로 변환하여 구합니다.

76 105 102 101

1001100 1101001 1100110 1100101

값이 다 양수니까 7자리의 이진수 앞에 0을 붙여줍니다.

01001100 01101001 01100110 01100101

그리고 이들을 한줄로 줄 붙여 저장하고 다시 6자리씩 끊어 계산해 값을 입력한게 위에 나타난 표 입니다.

T = int(input())
for tc in range(1, T+1):
    S = input()
    b = ""
    for i in S:
        if i.isupper():
            v = bin(ord(i)-65)[2:]
        elif i.islower():
            v = bin(ord(i)-71)[2:]
        elif i.isdigit():
            v = bin(ord(i)+4)[2:]
        if len(v) != 6:
            v = (6-len(v))*"0" + v
        b += v
    c = ''
    for j in range(0, len(b), 8):
        c += chr(int('0b'+b[j:j+8], 2))
    print(f'#{tc} {c}')

카테고리:

업데이트:

댓글남기기