문제 : https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PR4DKAG0DFAUq
시간 제한 | 메모리 제한 | 난이도 | 알고리즘 분류 |
30초 | 힙, 정적 : 256 MB / 스택 : 1MB | D2 | - |
문제
풀이
간단한 인코딩-디코딩 문제이기 때문에 문제에서 설명한 절차의 반대 순서로 문자를 변환해나가면 된다.
Base64 Encoding한 문자열을 다시 아스키코드 기반으로 디코딩 하는 절차는 다음과 같다.
1. 입력받은 문자열을 Base64 표에 대응하는 정수값으로 변환한 후, 다시 아스키코드 표에 맞게 변환해준다.
2. 1의 결과를 앞에서부터 2진수로 변환한다.
3. 2를 수행하는 과정에서, 인코딩 시 6bit 씩 잘라읽었으므로 6과 8의 최소공배수인 24bit 단위로 2진수를 10진수로 변환하여 아스키코드 상의 글자를 읽어 출력한다. (6자리 이진수 4개(24%6)가 아스키코드 정수값 3개(24%8)로 디코딩 될 수 있다.)
풀이법에 비해 코드 작성은 다소 복잡하게 된 면이 있다. 시간이 되면 다시 작성해볼 계획이다.
코드 작성
#include <iostream>
#include <math.h>
using namespace std;
char text[100001];
int toBit[24];
int decoding(int *smallBit) { //8비트씩 10진수로 바꿔 리턴
int num=0;
for (int i=0 ; i<8 ; i++) {
int pows = pow(2, 7-i);
num+=( *(smallBit+i) * pows );
}
return num;
}
int main() {
int T;
scanf("%d\n", &T);
for (int t=1 ; t<=T ; t++) {
scanf("%s\n", &text);
for (int i=0 ; text[i]!='\0' ; i++) { // 아스키코드 수랑 비교하여 숫자 변환
if (text[i]-0==43) text[i] = 62;
else if(text[i]-0==47) text[i] = 63;
else if (text[i]-0<=57) text[i] = text[i]+4;
else if (text[i]-0<=90) text[i] = text[i]-65;
else text[i] = text[i]-71;
}
printf("#%d ", t);
int countBit=0;
for (int i = 0 ; text[i]!='\0' ; i++) { // 한 문자 씩 반복
for (int j = 5 ; j>=0 ; j--, countBit++) { // 숫자 2진수로 변환하여 toBit[] 배열에 저장
toBit[countBit%24] = (text[i]>>j)&0x1;
}
if (i%4==3) { // toBit 배열 꽉 차면 문자화한다. (6자리 2진수 4개가 아스키코드 숫자 3개로 디코딩된다.)
for (int m = 0 ; m<24 ; m++) {
if (m%8==0) printf("%c", decoding(&toBit[m]));
}
countBit=0;
}
}
printf("\n");
}
}
END.
'알고리즘 > SW EA' 카테고리의 다른 글
SWEA (1225) [S/W 문제해결 기본] 7일차 - 암호생성기 - c/c++ (1) | 2023.11.24 |
---|