[SWEA]1928. Base64 Decoder
1928.Base64 Decoder
문제
우선 Encoding을 아래와 같이 해줍니다.
- 24비트 버퍼 위쪽(MSB)부터 한 byte씩 3byte의 문자를 집어 넣습니다.
- 버퍼의 위쪽부터 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}')
댓글남기기