텍스트를 암호화하는 방법 중에 보안상 취약하긴 하지만 흔하게 쓰이는 방법으로 알파벳 글자를 다른 글자로 돌리는 방법이 있다. 즉 알파벳의 각 글자를 다른 글자로 치환한다. 암호화된 것을 다시 원래대로 되돌릴 수 있으려면 두 개의 서로 다른 글자가 같은 글자로 치환되지 않아야 한다.
암호화된 텍스트가 한 줄 이상 입력되는데, 각 줄마다 서로 다른 치환 방법이 적용된다고 가정하자.
암호화 이전의 텍스트에 있는 단어는 모두 주어진 사전에 들어있는 단어라고 가정하고, 암호화된 텍스트를 해독하여 원래 텍스트를 알아내자.
입력
입력은 한 개의 정수 n이 들어있는 행으로 시작되며 그 다음 줄부터는 한 줄에 하나씩 n개의 소문자로 쓰인 단어들이 알파벳 순으로 입력된다. 이 n개의 단어들은 복호화된 텍스트에 들어갈 수 있는 단어로 구성된 사전이다. 사전 뒤에는 몇 줄의 텍스트가 입력된다. 각 줄은 앞에서 설명했던 방법에 따라 암호화된다.
사전에 들어갈 수 있는 단어의 개수는 1,000개를 넘지 않는다. 단어의 길이는 16글자를 넘지 않는다. 암호화된 텍스트에는 소문자와 스페이스만 들어가며 한 줄의 길이는 80글자를 넘어가지 않는다.
출력
각 줄을 복호화하여 표준 출력으로 출력한다. 여러 문장으로 복호화될 수 있다면 그 중 아무 결과나 출력하면 된다. 가능한 풀이가 없다면 알파벳 모든 문자를 *로 바꾼다.
입력 예
6
and
dick
jane
puff
spot
yertle
bjvg xsb hxsn xsb qymm xsb rqat xsb pnetfn
xxxx yyy zzzz www yyyy aaa bbbb ccc dddddd
출력 예
dick and jane and puff and spot and yertle
**** *** **** *** **** *** **** *** ******
문자열을 저장할때 error C2106 : '=' : 왼쪽 피연산자는 l-value이어야 합니다. 오류가 뜰경우
> strcpy를 이용하라.
1.글자수가 사전 단어, 암호화된 텍스트 양쪽 다 유일할때는 반드시 그 단어로 치환 되어야 합니다
2.암호화된 텍스트에 있는 글자수가 사전에 없다면 복호화가 불가능 합니다.(* 표시해야함)
3.2개 이상 존재하는 단어들은 1번 과정에서 복호화된 문자들부터 하나씩 처리해나가도록 합시다...
#include <iostream>
using namespace std;
#define lowA 97
void changeToAsterisk(char *);
int main(){
int dic = 0;
char dicword[1000][16] = {0,};
char toEncode[80];
char toEncodePart[80][16] ={0,};
int fre[16] = {0,};
int dic_count[1000]={0,};
char in_dic_count[16][16]={0,}; // 사전을 글자수별로 정리해 놓은 것.
char decode[lowA+26] = {0,}; // 복호화된 a b c d가 실제로 어떤 값인지 저장하고 있는 배열
fre[count]++;
dic_count[i] = count;
//특정 글자수의 빈도수 저장과 동시에 dic의 어떤 인덱스에서 그 글자수가 나타났는지도 저장해야한다.
// in_dic_count[count] = dicword[i];
strcpy(in_dic_count[count],dicword[i]);
//그 글자수를 가진 딕의 배열도 저장해두자..
i++;
}
fflush(stdin);
while(1){
gets(toEncode);
char *Encode_Part;
char copy_Encode[80];
int idx=0;
int fre_En[16] = {0,};
int fre_where[16] = {0,};//특정 글자수 idx , 저장값 Encode_part의 인덱스
char* sameFre[16][80] = {0,};//글자수가 같은 문자열들 같은 인덱스에 저장 [글자수][문자열들]