본문 바로가기

백준

백준9322 - 철벽 보안 알고리즘

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