소스 코드(라이브러리 X)

T = int(input())

# 표 1
decode = ['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','+','/'
          ]

for tc in range(1,1+T):

    # 입력받는 글자(인코딩 된 상태)
    word = list(input())

    # 글자의 길이
    length = len(word)

    # word의 글자 -> 표1에 따라 숫자로 변환 -> 이진수로 변환 -> 하나의 res로 만들기
    res = ''

    for q in range(length):

        # word -> 표1에 따라 숫자로 변환
        num = decode.index(word[q])

        # num -> 이진수로 변환
        # int형태로 더하면 단순 숫자의 합이 나오므로 str로 변환하고 앞의 0b 제거
        bin_num = str(bin(num)[2:])

        # bin_num의 길이가 6보다 작으면 앞에 0 붙여주기
        # 1을 이진수로 바꾸면 1로 나옴(필요한 값은 000001임)
        while len(bin_num) < 6:
            bin_num = '0' + bin_num

        res += bin_num
    
    # 문제에서 구하고자 하는 원래 문장
    r = ''

    # 글자의 길이 * 6에서 8비트씩 자름
    for w in range(length*6//8):

        # 8비트씩 자르기
        # 자른 값을 10진수로 변환
        e = int(res[w*8:w*8+8],2)

        # 아스키코드의 값을 r에 추가
        r += chr(e)

    print('#{} {}'.format(tc,r))

 

소스 코드(라이브러리 O)

from base64 import b64decode

T = int(input())

for tc in range(1, T + 1):

    word = input()
    res = b64decode(word).decode('UTF-8')

    print('#{} {}'.format(tc,res))

해결 방법

파이썬의 base64 라이브러리를 사용하면 손쉽게 문제해결 가능

 

내가 푼 방법

 

1. input값(str)을 받는다

2. 표1에서 해당 문자의 값(index)을 찾는다

3. 이진수로 변환

4. 변환한 값을 하나의 값(str)으로 만든다

5. 만들어진 값을 8비트 단위로 자른다

6. 8비트로 자른 값을 10진수로 변환한다

7. 10진수로 변환한 값을 아스키코드에 넣고 변환한다


느낀 점

문제 이해가 어려웠던 문제

 

개인적으로는 D2라기엔 D4보다도 어렵게 느껴졌던 문제

 

그래도 풀어서 좋고, Base64나 라이브러리를 공부할 수 있어서 좋았다

 

ps. 개인적인 코드와 코드를 작성의 이유를 적은 것입니다.

 

오류적절치 않은 문법이 존재할 수 있으며, 다른 분들께는 굉장히 비효율적인 방법으로 여겨질 수 있습니다.

 

혹시 개선 사항, 오류 및 문제에 대한 수정 사항 등을 댓글로 남겨주신다면 감사한 마음으로 배우고 수정하겠습니다.