본문 바로가기

Algorithm

백준 1718번 암호

반응형

문제

Vigenere cipher이라는 암호화 방법은 암호화하려는 문장 (평문)의 단어와 암호화 키를 숫자로 바꾼 다음, 평문의 단어에 해당하는 숫자에 암호 키에 해당하는 숫자를 더하는 방식이다. 이 방법을 변형하여 평문의 단어에 암호화 키에 해당하는 숫자를 빼서 암호화하는 방식을 생각해 보자.

예를 들어 암호화 키가 love이고, 암호화할 문장이 “nice day” 라면 다음과 같이 암호화가 이루어진다.

제시된 평문의 첫 번째 문자인 ‘n’은 해당 암호화 키 ‘l’의 알파벳 순서가 12 이므로 알파벳상의 순서에서 ‘n’보다 12앞의 문자인 ‘b’로 변형된다.

변형된 문자가 ‘a' 이전의 문자가 되면 알파벳 상에서 맨 뒤로 순서를 돌린다. 예를 들면 평문의 세 번째 문자인‘c’는 알파벳 상에서 3 번째이고 대응하는 암호화키 ‘v'는 알파벳 순서 22로 ‘c'에서 22 앞으로 당기면 ‘a'보다 훨씬 앞의 문자이어야 하는데, ‘a’앞의 문자가 없으므로 ‘z’로 돌아가 반복되어 ‘g’가 된다. 즉 평문의 문자를 암호화키의 문자가 알파벳 상에서 차지하는 순서만큼 앞으로 뺀 것으로 암호화한다.

평문의 문자가 공백 문자인 경우는 그 공백 문자를 그대로 출력한다.

이와 같은 암호화를 행하는 프로그램을 작성하시오.

입력

첫째 줄에 평문이, 둘째 줄에 암호화 키가 주어진다.

평문은 알파벳 소문자와 공백문자(space)로 만  구성되며, 암호화 키는 알파벳 소문자만으로 구성된다. 평문의 길이는 공백까지 포함해서 30000자 이하이다.

출력

첫 번째 줄에 암호문을 출력한다.

 

 

머리 조금만 돌려보면 됨.

 

#include <iostream>
#include <string>
#include <queue>

using namespace std;



string sec;
string str;

queue<pair<char, char> > que;
queue result;

int main(void)
{



getline(cin, str);
cin >> sec;
int count = 0;


for(int i = 0; i < str.size(); i++)
{

if(count == sec.size())
count = 0;
   
   que.push({sec[count],str[i]});
   count++;

}
//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



while(!que.empty())
{


int test = que.front().first - 'a'+1;
int test2 = que.front().second - 'a'+1;
que.pop();

if(test2 >0)
{

if(test2 > test)

    char temp = 'a'+test2-test-1;
    result.push(temp);

}
else{



char temp = 'z'-(test - test2);
 result.push(temp);



}
   }
   else{
   
    result.push(' ');
   
   }




}


while(!result.empty())
{
cout<<result.front();
result.pop();
}

    


}

반응형

'Algorithm' 카테고리의 다른 글

백준 1260번 DFS와 BFS 재풀이.  (0) 2019.10.08
백준 6603번 로또  (0) 2019.10.07
백준 2897번 몬스터 트럭  (0) 2019.09.30
백준 10814번 나이순 정렬  (0) 2019.09.25
백준 2799번 블라인드  (0) 2019.09.22