SWEA 1928. Base64 Decoder

JeanDeluge·2023년 2월 26일

SWEA

목록 보기
2/8

풀이과정

  1. 먼저 문자와 숫자를 맵핑 시킬 dictonary 선언 후, 표와 일치하게 문자와 숫자를 맵핑한다.
  2. 받은 문자에 맞게 맵핑된 숫자를 가져와 이진수로 변환 시켜 하나의 이진문자열을 만들어준다.
    2-1. 이진수로 변환 시켰을 시 "0b000" 의 형태로 변환된다. 그렇기때문에 0b를 제거해준다.
    2-2. 6 bit 로 끊어서 변환시켰던 것이기 때문에 이 이진수를 6자리로 만드는 작업을 해준다.
    3.변환한 이진문자열을 8자리씩 끊어서 다시 2진수로 만들어준다.
  3. 만들어준 2진수를 char 형으로 변환시킨다

 incoded = input()
    upper = list(map(chr, range(ord('A'), ord('Z')+1)))
    lower = list(map(chr, range(ord('a'), ord('z') +1)))
    nums = list(map(str, range(0, 10)))
    dict_code = {}
    for k in upper :
        dict_code[k] = ord(k) -65
    for k in lower :
        dict_code[k] = ord(k) - 71
    for k in nums :
        dict_code[k] = ord(k) + 3
    dict_code['+'] = 62
    dict_code['/'] = 63
    
    decode = ""
    quote = ""
    for s in incoded:
        abyte =  bin(dict_code[s])[2:]
        if len(abyte) < 6:
            abyte = "0"*(6-len(abyte)) + abyte
        decode += abyte
    for i in range(0, len(decode), 8):
        quote += chr(int(decode[i:i+8], 2))
    
    print(quote)

답이 비슷하게 나오긴했는데 다음과 같았다

Life itself is a quo3atio]î

아무래도 dict_code 에서 알파벳과 숫자 맵핑을 잘못한 것 같았다.

그래서 확인해보니 숫자형 문자에서 숫자가 잘 못 맵핑되었다.

for test_case in range(1, T + 1):
    # ///////////////////////////////////////////////////////////////////////////////////
    incoded = input()
    upper = list(map(chr, range(ord('A'), ord('Z')+1)))
    lower = list(map(chr, range(ord('a'), ord('z') +1)))
    nums = list(map(str, range(0, 10)))
    dict_code = {}
    for k in upper :
        dict_code[k] = ord(k) -65
    for k in lower :
        dict_code[k] = ord(k) - 71
    for k in nums :
        dict_code[k] = ord(k) + 4
    dict_code['+'] = 62
    dict_code['/'] = 63

    decode = ""
    quote = ""
    for s in incoded:
        abyte =  bin(dict_code[s])[2:]
        if len(abyte) < 6:
            abyte = "0"*(6-len(abyte)) + abyte
        decode += abyte
    for i in range(0, len(decode), 8):
        quote += chr(int(decode[i:i+8], 2))
    
    print("#%d %s" % (test_case , quote))

오늘 찾으면서 배운 함수

range(A,B,C) : B만큼동안 A숫자부터 C씩 끊는다
int(A, B) : 십진수 A를 B진수로 만든다.
array[A:B] : 앞에서 A번째부터 B번째 배열 엘리먼트까지를 반환한다.
ord(A) : ascii 코드 번호를 반환한다.

0개의 댓글