알고리즘/문제 풀이

9322번: 철벽 보안 알고리즘

Themion 2021. 12. 28. 16:24

https://www.acmicpc.net/problem/9322

 

9322번: 철벽 보안 알고리즘

소희는 공개키와 개인키 한 쌍으로 보안을 유지하는 것이 매우 불편하다고 생각했다. 그래서 소희는 공개키만을 이용하는 암호화 체계를 개발했다. 이를 "철벽 보안 알고리즘"이라고 부르기로

www.acmicpc.net

단어가 총 1000개 이하이므로 제1 공개키와 제2 공개키, 암호문을 입력받은 뒤, 제1 공개키와 제2 공개키를 비교하면서 암호문을 특정 순서대로 출력한다면 시간 제한 이내에 답을 출력할 수 있다. 또, 제1 공개키를 입력받아 map에 저장한 뒤 제2 공개키를 이용해 암호문의 복호 순서를 저장한 뒤 암호문을 입력받아 구한 순서대로 출력하는 경우에도 시간 제한 이내에 답을 출력할 수 있다.

- 공개키 비교

#include <iostream>
#include <string>

using namespace std;

#define MAX_N 1000

void test_case() {
    int N;
    // key1: 제1 공개키, key2: 제2 공개키, code: 암호문
    string key1[MAX_N], key2[MAX_N], code[MAX_N];

    cin >> N;

    // 공개키와 암호문을 단어의 배열로 저장
    for (int i = 0; i < N; i++) cin >> key1[i];
    for (int i = 0; i < N; i++) cin >> key2[i];
    for (int i = 0; i < N; i++) cin >> code[i];

    // 제1 공개키와 제2 공개키를 비교해 출력 순서를 계산
    for (int i = 0; i < N; i++) for (int j = 0; j < N; j++)
        if (key1[i] == key2[j]) {
            // 제1 공개키 순서로 입력받은 암호문을 제2 공개키 순서로 출력
            cout << code[j] << ' ';
            break;
        }

    // 개행 문자를 출력하여 출력을 종료
    cout << '\n';
}

int main() {
    // 입출력 속도 향상
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    
    int T;
    // 테스트 케이스의 수를 입력받고 각 테스트 케이스를 실행
    for (cin >> T; T--; ) test_case();
    return 0;
}

- map

#include <iostream>
#include <string>
#include <unordered_map>

using namespace std;

#define MAX_N 1000

void test_case() {
    // N: 단어의 개수, ord[i]: i번째 암호문의 복호문에서의 위치
    int N, ord[MAX_N] = { 0, };
    // str: 암호 순서를 계산할 때 사용할 변수, code: 암호문
    string str, code[MAX_N];
    // m[i]: i번째 암호 예제
    unordered_map<string, int> m;

    // 단어의 개수를 입력받은 뒤
    cin >> N;
    // 암호 예제의 각 단어 순서를 저장한 뒤
    for (int i = 0; i < N; i++) {
        cin >> str;
        m[str] = i;
    }
    // 복호 예제를 이용해 암호문 -> 복호문 순서를 저장
    for (int i = 0; i < N; i++) {
        cin >> str;
        ord[i] = m[str];
    };
    // 암호문을 복호문 순서로 저장한 뒤 순서대로 출력
    for (int i = 0; i < N; i++) cin >> code[ord[i]];
    for (int i = 0; i < N; i++) cout << code[i] << (i < N - 1 ? ' ' : '\n');
}

int main() {
    // 입출력 속도 향상
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    int T;
    // 테스트 케이스의 수를 입력받고 각 테스트 케이스를 실행
    for (cin >> T; T--; ) test_case();

    return 0;
}

'알고리즘 > 문제 풀이' 카테고리의 다른 글

9461번: 파도반 수열  (0) 2021.12.28
9375번: 패션왕 신해빈  (0) 2021.12.28
9252번: LCS 2  (0) 2021.12.28
9251번: LCS  (0) 2021.12.28
9205번: 맥주 마시면서 걸어가기  (0) 2021.12.28