Coding Test/SWEA

[SWEA] Base64 Decoder(1928) - Python

도구혜지루루 2023. 10. 29. 18:49
728x90
반응형

문자열을 입력 받아 문제 제시 방법대로 해석한 문자열을 출력하는 문제이다.

 

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com


테스트 케이스

더보기

[TC1]

입력 : TGlmZSBpdHNlbGYgaXMgYSBxdW90YXRpb24u

출력 : Life itself is a quotation.

 

[TC2]

입력 : U3VzcGljaW9uIGZvbGxvd3MgY2xvc2Ugb24gbWlzdHJ1c3Qu

출력 : Suspicion follows close on mistrust.

 

[TC3]

입력 : VG8gZG91YnQgaXMgc2FmZXIgdGhhbiB0byBiZSBzZWN1cmUu

출력 : To doubt is safer than to be secure.

 


해결 과정

처음 문제를 봤을 때는 이해하지 못하였다. 결국 아래 댓글에서 힌트를 얻어 해결 하였다. 먼저 표를 보고 문자들에 대응하는 숫자로 변경한다. 그리고, 변경한 숫자를 6자리 2진수로 표현하고, 이것들을 쭉 이어붙인다. 한 줄로 이어붙인 2진수들을 8자리씩 끊어서 10진수로 변경한다. 각각의 10진수를 아스키 코드로 변환한다.

 


코드

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', '+', '/'
          ]

T = int(input())

for test_case in range(1, T + 1):
    arr = list(input())
    value = ''

    for i in range(len(arr)):
        num = decode.index(arr[i])
        bin_num = str(bin(num)[2:])

        while len(bin_num) < 6:
            bin_num = '0' + bin_num
        value += bin_num

    result = ''
    for j in range(len(arr) * 6 // 8):
        data = int(value[j * 8 : j * 8 + 8], 2)
        result += chr(data)

    print(f'#{test_case} {result}')

 

주석 처리

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', '+', '/'
          ]

T = int(input())

for test_case in range(1, T + 1):
    arr = list(input())
    value = ''

    for i in range(len(arr)):
        # 문자를 decode에서 대응하는 숫자를 찾음
        num = decode.index(arr[i])
        # 찾은 숫자를 2진수로 변경후 문자열로 변경
        # bin(10) = 0b1010
        # 앞 2자리를 지움
        bin_num = str(bin(num)[2:])

        while len(bin_num) < 6:
            # 지워진 앞 2자리에 0을 채움
            bin_num = '0' + bin_num
        # 만들어진 2진수를 모두 이어 붙임
        value += bin_num

    result = ''
    # 2진수로 된 arr의 길이 총 비트 수를 8비트씩 계산할 동안
    for j in range(len(arr) * 6 // 8):
        # 2진수를 8bit씩 끊어서 10진수로 변경
        data = int(value[j * 8 : j * 8 + 8], 2)
        # 10진수를 아스키 코드로 변환
        result += chr(data)

    print(f'#{test_case} {result}')
728x90
반응형