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 |