본문 바로가기

카테고리 없음

[SWEA] 1928. Base64 Decoder

반응형

SWEA는 무단복제가 금지 되어있어서 문제는 링크 타서 확인하시면 됩니다.

문제보기 -> 1928. Base64 Decoder

 

SW Expert Academy

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

swexpertacademy.com


D2 문제중에 두번째로 정답률이 높은 문제지만 이해가 되지 않아서 바로 크롤링을 한 문제입니다.

인코딩 디코딩 개념이해를 먼저하는 것이 중요합니다. 저도 인코딩 디코딩에 대한 개념이 없었기에 지피티랑 크롤링을 하여 정리해보았습니다. 아래에서 확인 해보세요!

 

Base64 Decoder Encoder / 아스키 코드 변환

SWEA 문제를 풀면서 Base64에 대한 개념이 부족한 것 같아 스스로 공부하면서 궁금한 순서대로 정리를 하였다. 문제 풀이와 이해를 하는데 거의 2시간 정도 걸렸는데 나중에 기억나지 않을 것 같아

rnflajdrnfl.tistory.com


문제 이해

1. 문제에서 주어진 Input값은 인코딩 된 결과 값입니다.
2. 우리가 구해야하는 코드는 인코딩 값을 입력하면 디코딩 값으로 변환해주는 코드입니다.
3. 이때 문제에서 인코딩 방식을 이해해야 합니다.

인코딩 이해

1. 3byte의 문자를 집어넣는다는 것은 3개의 문자열을 인코딩 한다는 뜻 입니다.( 아스키코드 기준 )
(왜 아스키코드가 기준이 되는지는 위의 설명을 확인 해보시기 바랍니다.)
2. 즉 문자 1개를 1바이트로 생각한다는 의미이고, 1바이트는 8비트이고 모두 3바이트이므로 총 24비트로 표현을 하는것입니다.
3. 문자를 8크기의 2진수로 변경을 하여 모두 붙입니다. (총 24크기의 2진수)
4. 이후 6비트씩 자르고 [표-1]의 문자로 Encoding하므로 총 4개의 Encoding값이 나옵니다.

문제의 Input값은 인코딩을 거쳐서 나오므로 우리는 디코딩 과정을 코드로 작성하여야합니다.

디코딩 이해

1. 디코딩은 인코딩의 반대과정을 거치면 됩니다.
2. 먼저 Input의 각 문자를 [표-1]에 대조되는 값으로 변경합니다.
3. 인코딩 과정에서 문자는 6비트로 만들어졌으므로 디코딩에서는 2.번과정을 거쳐 대조된 값을  6크기의 2진수로 변경하여 붙입니다.
4.붙여진 2진수를 다시 8크기의 2진수로 자르고 문자열로 바꾸어줍니다.


코드 구현 1

T = int(input())

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 test_case in range(1, T + 1):
	string=input()
	bin_list=""
	for char in string:
		change = decode.index(char)
		bin_change=format(change,'06b')     
		bin_list+=bin_change
    
	result=''
	for i in range(0,len(bin_list),8):
		divided_num = int(bin_list[i:i+8],2)
		result+=chr(divided_num)

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

 

 

이코드는 [디코딩 이해과정]을 코드로 구현하였습니다.


코드 구현 2 ( 라이브러리 사용 )

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

파이썬에는 아스키코드 인코딩 디코딩을 편하게 하는 라이브러리가 있어서 다른 분들은 다음과 같이 풀었다고 한다.

나도 궁금해서 swea에 이코드를 돌려봤더니 에러가 나오는데 왜 나오는지는 모르겠지만 라이브 러리를 사용하면 다음과 같이 편하게 할 수있다. 해당 라이브러리나 코드에 대한 궁금한 부분이있으면 내가 맨 위에 이 코테를 풀면서 스스로 궁금했던 부분을 블로그에 정리했으니 참고하면 좋을거 같다.

반응형