[SWEA] 1928. Base64 Decoder
โ๏ธ ๋ฌธ์ ์์ฝ
SW Expert Academy
SW ํ๋ก๊ทธ๋๋ฐ ์ญ๋ ๊ฐํ์ ๋์์ด ๋๋ ๋ค์ํ ํ์ต ์ปจํ ์ธ ๋ฅผ ํ์ธํ์ธ์!
swexpertacademy.com
์ ๋ ฅ์ผ๋ก Base65 Encoding ๋ String์ด ์ฃผ์ด์ก์ ๋, ํด๋น String์ Decoding ํ์ฌ ์๋ฌธ์ ์ถ๋ ฅํ๋ผ.
Encoding ๋ฐฉ๋ฒ
๐ง ๋ฌธ์ ํด์
๋ฌธ์ ๋ง ์ฝ์ด์๋ ์ธ์ฝ๋ฉํ๋ ๋ฐฉ๋ฒ์ด ์ ์๋ฟ์ง ์์๋ค.
๋ฌธ์ ์ ๋๊ธ์ ํํธ์ผ์ ๊ทธ ๋ฐฉ๋ฒ์ ์์๋๋ค.
์ธ์ฝ๋ฉ ํ๋ ๋ฐฉ๋ฒ
์๋ฅผ ๋ค์ด, ์๋ฌธ์ด `Life itself is a quotation.`์ด๋ผ๊ณ ๊ฐ์ ํ์.
์ด์ ํ ๊ธ์์ฉ ์์คํค์ฝ๋๋ฅผ ๊ตฌํ ๋ค, ์ด๋ฅผ ์ด์ง์๋ก ๋ฐ๊พผ๋ค.
L -> L์ ์์คํค์ฝ๋ 76์ด๋ค. ๊ทธ๋ฆฌ๊ณ 76์ ์ด์ง์๋ก ๋ฐ๊พธ๋ฉด `01001100`์ด๋ค.
i -> i๋ ์์คํค์ฝ๋ 105์ด๋ค. ๊ทธ๋ฆฌ๊ณ 105๋ฅผ ์ด์ง์๋ก ๋ฐ๊พธ๋ฉด `01101001`์ด๋ค.
.
.
.
์์์ ๊ตฌํ ์ด์ง์๋ฅผ ํ ์ค๋ก ์ด์ด๋ถ์ธ๋ค.
๊ทธ๋ผ `0100110001101001 ...`๊ฐ ๋ ๊ฒ์ด๋ค.
์ด์ ์ ๋ฌธ์์ด์ 6bit ์ฉ ์ชผ๊ฐ ๋ค, ์ด๋ฅผ ๋ค์ ์ญ์ง์๋ก ๋ฐ๊พธ์ด ํ์ ๋์ํ๋ ๋ฌธ์๋ฅผ ์ฐพ๋๋ค.
6bit ์ฉ ์ชผ๊ฐ๋ฉด `010011` `000110` `1001 ...` ์ด ๋๋ค.
`010011`์ ์ญ์ง์ 19์ด๊ณ , ํ์์ 19์ ๋์ํ๋ ๊ฐ์ `T`์ด๋ค.
`000110`์ ์ญ์ง์ 6์ด๊ณ , ํ์์ 6์ ๋์ํ๋ ๊ฐ์ `G`์ด๋ค.
์ด๋ฐ์์ผ๋ก, `Life itself is a quotation.`๊ฐ ์ธ์ฝ๋ฉ๋์ด `TG ...`๊ฐ ๋๋ ๊ฒ์ด๋ค.
โ๏ธ ์ฐ๋ฆฌ๋ ์๋ฌธ์ ์ธ์ฝ๋ฉ ํ๋ ๊ฒ์ด ์๋๋ผ, ์ธ์ฝ๋ฉ ๋ ๋ฌธ์์ด์ "๋์ฝ๋ฉ" ํด์ผํ๋ค.
์ธ์ฝ๋ฉ ํ๋ ๋ฐฉ๋ฒ์ ์ดํดํ์ผ๋ฉด, ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋์ฝ๋ฉ ํ๋ ๋ฐฉ๋ฒ์ ์ ์ถํด๋ณด์.
๋์ฝ๋ฉ ํ๋ ๋ฐฉ๋ฒ
์๋ฅผ ๋ค์ด, ๋์ฝ๋ฉ ๋ ๋ฌธ์์ด์ด `TG ...`๋ผ๊ณ ๊ฐ์ ํ์.
์ธ์ฝ๋ฉ๊ณผ ๋ฐ๋๋ก ์งํํ๋ฉด ๋๋ค.
T -> ํ์ ๋์ํ๋ ๊ฐ 19 -> 19์ ์ด์ง์ `010011` (โญ๏ธ ์ด ๋ ์ด์ง์๋ 6bit๋ก ๋ง๋ค์ด์ผ ํ๋ค!)
G -> ํ์ ๋์ํ๋ ๊ฐ 6 -> 6์ ์ด์ง์ `000110`
.
.
.
์ด์ง์๋ฅผ 6bit๋ก ๋ง๋ค์ด์ผ ํ๋ ์ด์ ๋, ์ธ์ฝ๋ฉ ํ ๋ 6bit์ฉ ์ชผ๊ฐฐ๊ธฐ ๋๋ฌธ์ด๋ค. (ํ์ด์ฌ์์๋ `zfill()`์ ์ด์ฉํ์ฌ ์ํ๋ ๋งํผ 0์ผ๋ก ์ฑ์ธ ์ ์๋ค.)
๊ทธ๋ฆฌ๊ณ ์ด๋ฅผ ํ ์ค๋ก ์ด์ด๋ถ์ธ๋ค. ๊ทธ๋ผ `010011000110 ...`๊ฐ ๋ ๊ฒ์ด๋ค.
์ด์ ์ ๋ฌธ์์ด์ 8bit(=1byte) ์ฉ ์ชผ๊ฐ ๋ค, ์ด๋ฅผ ๋ค์ ์ญ์ง์๋ก ๋ฐ๊พธ์ด ์์คํค์ฝ๋์ ๋์ํ๋ ๋ฌธ์๋ฅผ ์ฐพ๋๋ค.
8bit ์ฉ ์ชผ๊ฐ๋ฉด `01001100` `0110 ...` ์ด ๋๋ค.
`01001100`์ ์ญ์ง์ 76์ด๊ณ , ์์คํค์ฝ๋์์ 76์ `L`์ด๋ค.
์ด๋ฐ์์ผ๋ก, `TG ...`๊ฐ ๋์ฝ๋ฉ๋์ด `L ...`๊ฐ ๋๋ ๊ฒ์ด๋ค. (๋ต์ `Life itself is a quotation.`์ด๊ฒ ์ง..)
โจ ๋์ ํ์ด
๋๋ `lst`์ `dic`์ ๋ชจ๋ ์ ์ธํ๋๋ฐ, `lst`๋ง ์ ์ธํ๊ณ ์ ํ๋ค๋ฉด `binary = format(dic[x], 'b')` ๋ถ๋ถ์ `binary = format(lst.index(x), 'b')`๋ก ๋ณ๊ฒฝํ์ฌ ๊ฐ์ ๋ต์ ์ป์ ์ ์๋ค.
๐โ๏ธ ํ์ง๋ง `index()` ๋ฉ์๋๋ ๋ฆฌ์คํธ์์ ํน์ ๊ฐ์ ์ธ๋ฑ์ค๋ฅผ ๋ฐํํ๊ธฐ ์ํด ๋ฆฌ์คํธ ์ ์ฒด๋ฅผ ํ์ํด์ผ ํ๋ฏ๋ก ์๊ฐ๋ณต์ก๋๊ฐ `O(n)`์ด๋ค. ๋ฐ๋ฉด ๋์ ๋๋ฆฌ๋ `O(1)`์ ์๊ฐ๋ณต์ก๋๋ก ์ ๊ทผํ ์ ์์ผ๋ฏ๋ก, ๋งค๋ฒ `index()`๋ฅผ ํธ์ถํ์ฌ ์ธ๋ฑ์ค๋ฅผ ๊ตฌํ๋ ๊ฒ๋ณด๋ค ๋ ํจ์จ์ ์ด๋ผ๊ณ ์๊ฐํ๋ค.
import sys
from collections import defaultdict
sys.stdin = open("input.txt", "r")
sys.stdout = open("output.txt", "w")
if __name__ == '__main__':
T = int(input())
lst = [
'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','+','/'
]
dic = {val : idx for idx, val in enumerate(lst)}
for test_case in range(1, T+1):
S = input()
print('#{}'.format(test_case), end=' ')
buffer = ''
for x in S:
binary = format(dic[x], 'b')
buffer += binary.zfill(6) # ์์ 0์ ์ฑ์์ 6bit ๋ก
ans = ''
for i in range(0, len(buffer), 8):
decimal = int(buffer[i:i+8], 2) # 8bit ์ฉ ๋ฌถ์ด์ 2์ง์๋ฅผ 10์ง์๋ก ๋ณํ
print(chr(decimal), end='') # 10์ง์๋ฅผ ์์คํค์ฝ๋๋ก ๋ณํ
print()