728x90
728x90
문제
다음과 같이 Encoding 을 한다.
1. 우선 24비트 버퍼에 위쪽(MSB)부터 한 byte씩 3 byte의 문자를 집어넣는다.
2. 버퍼의 위쪽부터 6비트씩 잘라 그 값을 읽고, 각각의 값을 아래 [표-1] 의 문자로 Encoding 한다.
입력으로 Base64 Encoding 된 String 이 주어졌을 때, 해당 String 을 Decoding 하여, 원문을 출력하는 프로그램을 작성하시오.
제약 사항
문자열의 길이는 항상 4의 배수로 주어진다.
그리고 문자열의 길이는 100000을 넘지 않는다.
입력
입력은 첫 줄에 총 테스트 케이스의 개수 T가 온다.
다음 줄부터 각 테스트 케이스가 주어진다.
테스트 케이스는 Encoding 된 상태로 주어지는 문자열이다.
출력
테스트 케이스 t에 대한 결과는 “#t”을 찍고, 한 칸 띄고, 정답을 출력한다.
(t는 테스트 케이스의 번호를 의미하며 1부터 시작한다.)
예제
[입력] | [출력] |
10 TGlmZSBpdHNlbGYgaXMgYSBxdW90YXRpb24u U3VzcGljaW9uIGZvbGxvd3MgY2xvc2Ugb24gbWlzdHJ1c3Qu VG8gZG91YnQgaXMgc2FmZXIgdGhhbiB0byBiZSBzZWN1cmUu T25seSB0aGUganVzdCBtYW4gZW5qb3lzIHBlYWNlIG9mIG1pbmQu QSBmdWxsIGJlbGx5IGlzIHRoZSBtb3RoZXIgb2YgYWxsIGV2aWwu … |
#1 Life itself is a quotation. #2 Suspicion follows close on mistrust. #3 To doubt is safer than to be secure. #4 Only the just man enjoys peace of mind. #5 A full belly is the mother of all evil. ... |
문제 해결 방법
- 문제에서 제시된대로 인코딩(Encoding)과 디코딩(Decoding) 작업을 해준 후 결과값을 출력해주는 문제이다.
- 10진수를 2진수로 바꿀 때는 @bin()@ 함수를, @N@자리의 2진수를 만들 때(남는 부분은 @0@으로 채울 때)는 @zfill(N)@ 함수를 사용한다.
- 인코딩 작업은 아래와 같은 과정으로 진행된다.
1. 입력을 받은 문자열 안의 각각의 요소를 테이블의 값(10진수)으로 변경하기
2. 각각의 테이블의 값(10진수)을 6자리의 2진수로 변경 후 합치기 (빈 공간은 0으로 채우기)
def encode(input_string):
values_table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
output_string = ""
for ch in input_string:
value_table = ""
# 입력 문자열의 각 요소를 테이블의 값으로 바꾸기
for idx, item in enumerate(values_table):
if item == ch:
value_table = idx
break
# 10진수를 2진수로 바꾸기 & 앞의 0b 문자 지우기
value_binary = bin(value_table)[2:]
# 6자리로 만들고, 빈 공간은 0으로 채우기
value_binary = value_binary.zfill(6)
# 2진수들을 합치기
output_string += value_binary
return output_string
- 디코딩 작업은 아래와 같은 과정으로 진행된다.
1. 2진수 문자열에서 8자리씩 뽑아내기
2. 뽑아낸 8자리 2진수를 10진수로 바꾸기
3. 10진수를 문자로 바꾼 후 합치기
def decode(input_string, digit):
output_string = ""
for i in range(0, len(input_string), digit):
binary_value = input_string[i:i + digit] # 8자리 뽑아내기
# 2진수를 10진수로 바꾸기
decimal_value = int(binary_value, 2)
# 10진수를 문자로 바꾸기
char_value = chr(decimal_value)
# 문자 합치기
output_string += char_value
return output_string
코드
# 인코딩 작업
## 1. 입력받은 문자열 안의 각각의 요소를 테이블의 값(10진수)으로 변경하기
## 2. 각각의 테이블의 값(10진수)을 6자리의 2진수로 변경 후 합치기 (빈 공간은 0으로 채우기)
def encode(input_string):
values_table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
output_string = ""
for ch in input_string:
value_table = ""
# 입력 문자열의 각 요소를 테이블의 값으로 바꾸기
for idx, item in enumerate(values_table):
if item == ch:
value_table = idx
break
# 10진수를 2진수로 바꾸기 & 앞의 0b 문자 지우기
value_binary = bin(value_table)[2:]
# 6자리로 만들고, 빈 공간은 0으로 채우기
value_binary = value_binary.zfill(6)
# 2진수들을 합치기
output_string += value_binary
return output_string
# 디코딩 작업
## 1. 2진수 문자열에서 8자리씩 뽑아내기
## 2. 뽑아낸 8자리 2진수를 10진수로 바꾸기
## 3. 10진수를 문자로 바꾼 후 합치기
def decode(input_string, digit):
output_string = ""
for i in range(0, len(input_string), digit):
binary_value = input_string[i:i + digit] # 8자리 뽑아내기
# 2진수를 10진수로 바꾸기
decimal_value = int(binary_value, 2)
# 10진수를 문자로 바꾸기
char_value = chr(decimal_value)
# 문자 합치기
output_string += char_value
return output_string
T = int(input())
for test_case in range(1, 1 + T):
S = input()
print(f"#{test_case} {decode(encode(S), 8)}")
참고
- 난이도: D2
728x90
728x90
'Problem Solving > SWEA' 카테고리의 다른 글
[SWEA-1204][Python] [S/W 문제해결 기본] 1일차 - 최빈수 구하기 (1) | 2023.10.23 |
---|---|
[SWEA-1284][Python] 수도 요금 경쟁 (1) | 2023.10.23 |
[SWEA-1285][C++] 아름이의 돌 던지기 (0) | 2023.10.23 |
[SWEA-1288][Python] 새로운 불면증 치료법 (1) | 2023.10.23 |
[SWEA-1940][Python] 가랏! RC카! (1) | 2023.10.19 |
[SWEA-1945][Python] 간단한 소인수분해 (1) | 2023.10.19 |
[SWEA-1946][Python] 간단한 압축 풀기 (1) | 2023.10.19 |
[SWEA-1948][Python] 날짜 계산기 (1) | 2023.10.19 |