https://www.acmicpc.net/problem/9322
9322번: 철벽 보안 알고리즘
문제 소희는 공개키와 개인키 한 쌍으로 보안을 유지하는 것이 매우 불편하다고 생각했다. 그래서 소희는 공개키와 개인키를 암호화 체계를 개발했다. 이를 "철벽 보안 알고리즘"이라고 부르기로 했다. 알고리즘은 다음과 같다. 한 단어는 1~10개의 대문자(A-Z)들로 이루어진 문자열이다. 한 문장은 공백으로 구분된 단어들로 이루어졌다. 제 1 공개키는 최대 한 번만 사용된 단어들로 되어있다. 제 2 공개키는 제 1 공개키의 단어들을 재배치하여 만들어진다. 평문
www.acmicpc.net
맵을 이용하면 쉽게 풀리는 문제이다.
ex.)
1 공개키 : A B C D E
2 공개키 : E C B A D
***2 공개키에서 1 공개키로 전환하는 과정***
2공개키 1공개키
0번째 글자 -> 4번째 글자
1번째 글자 -> 2번째 글자
2번째 글자 -> 1번째 글자
3번째 글자 -> 0번째 글자
4번째 글자 -> 3번째 글자
암호문 : X P A B C
***평문으로 만드는 과정***
X(0번째)는 4번째 글자로
P(1번째)는 2번째 글자로
A(2번째)는 1번째 글자로
B(3번째)는 0번째 글자로
C(4번째)는 3번째 글자로
평문 : B A P C X
#include <iostream>
#include <map>
#include <string>
using namespace std;
int main() {
int T; //테스트 케이스
cin >> T;
while (T--) {
int num; //삽입하려는 단어의 갯수
string s; //단어
string mat1[1000]; //1 공개키
string mat2[1000]; //2 공개키
string mat3[1000]; //평문
string mat4[1000]; //암호문
map<string, int> where; //1 공개키에 각가의 단어가 가지고 있는 위치, (단어가 key, 위치가 value)
map<int, int> mp; //2 공개키의 단어가 원래 있어야 할 위치, (2 공개키 단어의 위치가 key, 원래 있어야 할 공간이 value)
cin >> num;
//1 공개키 단어의 위치를 저장
for (int i = 0; i < num; i++) {
cin >> s;
mat1[i] = s;
where[s] = i;
}
//2 공개키 단어가 원래 있어야 할 위치
for (int i = 0; i < num; i++) {
cin >> s;
mat2[i] = s;
mp[i] = where[s];
}
//암호문을 작성
for (int i = 0; i < num; i++) {
cin >> s;
mat4[i] = s;
}
//암호문의 단어가 원래 있어야 할 위치로 평문에 보낸다.
for (int i = 0; i < num; i++) {
mat3[mp[i]] = mat4[i];
}
for (int i = 0; i < num; i++) {
cout << mat3[i] << ' ';
}
cout << '\n';
}
}
'백준' 카테고리의 다른 글
백준1074 - Z (0) | 2019.09.10 |
---|---|
백준2302 - 극장 좌석 (0) | 2019.09.09 |
백준4949 - 균형잡힌 세상 (0) | 2019.09.08 |
백준3985 - 롤 케이크 (0) | 2019.09.07 |
백준1213 - 팰린드롬 만들기 (0) | 2019.09.07 |