๐Ÿ’ซ ETC/Problem Solving

[SWEA] 1928. Base64 Decoder

ming412 2023. 11. 14. 17:36

โœ๏ธ ๋ฌธ์ œ ์š”์•ฝ

https://swexpertacademy.com/main/code/problem/problemDetail.do?problemLevel=2&contestProbId=AV5PR4DKAG0DFAUq&categoryId=AV5PR4DKAG0DFAUq&categoryType=CODE

 

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()