[백준 33869] 일기 암호화하기 (C#, C++) - soo:bak
작성일 :
문제 링크
설명
대문자 키워드로 암호표를 만든 뒤 문장의 각 문자를 치환해 암호문을 만드는 문제입니다.
접근법
먼저 키워드에서 알파벳을 처음 등장 순서대로 중복 없이 뽑아 암호표의 앞부분을 구성합니다. 등장 여부는 길이 26의 배열로 체크합니다.
다음으로 암호표의 뒷부분은 키워드에 없는 나머지 알파벳을 A부터 Z 순서로 이어 붙여 완성합니다. 이렇게 만든 암호표는 평문 A부터 Z까지의 인덱스에 대응됩니다.
이후 문장을 순회하며 각 문자의 인덱스로 암호표에서 대응하는 문자를 찾아 치환합니다.
Code
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
using System;
using System.Text;
class Program {
static void Main() {
var w = Console.ReadLine()!;
var s = Console.ReadLine()!;
var used = new bool[26];
var key = new StringBuilder();
foreach (var ch in w) {
var idx = ch - 'A';
if (!used[idx]) {
used[idx] = true;
key.Append(ch);
}
}
var cipher = new StringBuilder();
cipher.Append(key);
for (var i = 0; i < 26; i++) {
if (!used[i])
cipher.Append((char)('A' + i));
}
var sb = new StringBuilder();
foreach (var ch in s)
sb.Append(cipher[ch - 'A']);
Console.WriteLine(sb.ToString());
}
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <bits/stdc++.h>
using namespace std;
typedef vector<bool> vb;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
string w, s;
cin >> w >> s;
vb used(26, false);
string key;
for (char c : w) {
int idx = c - 'A';
if (!used[idx]) {
used[idx] = true;
key.push_back(c);
}
}
string cipher = key;
for (int i = 0; i < 26; i++) {
if (!used[i])
cipher.push_back('A' + i);
}
string res;
res.reserve(s.size());
for (char c : s)
res.push_back(cipher[c - 'A']);
cout << res << "\n";
return 0;
}