문제링크
https://www.acmicpc.net/problem/2703
2703번: Cryptoquote
Cryptoquote는 어떤 메시지가 있을 때, 각 알파벳을 다른 알파벳으로 변환해 암호화 하는 방법이다. 예를 들어, HPC PJVYMIY란 메시지가 있을 때, 이를 원래 메시지로 바꾼다면 ACM CONTEST가 된다. 위의 예
www.acmicpc.net
문제
Cryptoquote는 어떤 메시지가 있을 때, 각 알파벳을 다른 알파벳으로 변환해 암호화 하는 방법이다.
예를 들어, HPC PJVYMIY란 메시지가 있을 때, 이를 원래 메시지로 바꾼다면 ACM CONTEST가 된다.
위의 예를 바꾸는 규칙은 H=A, P=C, C=M, J=O, V=N, Y=T, M=E, I=S이다. 이처럼 Cryptoquote를 하려면, 문자와 문자 사이의 규칙이 있어야 한다.
암호화된 메시지와 문자와 문자 사이의 규칙이 주어졌을 때, 이를 원래 메시지로 바꾸는 프로그램을 작성하시오.
입력
첫째 줄에 테스트 케이스의 개수 T(1 ≤ T ≤ 1000)가 주어진다. 각 테스트 케이스는 다음과 같이 두 줄로 구성되어 있다.
테스트 케이스의 첫째 줄에는 암호화된 메시지가 주어지고, 둘째 줄에는 변환 규칙이 주어진다. 변환 규칙은 알파벳 대문자 26글자로 이루어져있고, 암호회된 메시지의 길이는 100 이하이다.
첫 번째 문자는 A에 해당하는 문자, 두 번째는 B, ..., 26번째는 Z에 해당하는 문자이다. 변환 규칙은 중복되지 않는다. 암호화된 메시지에는 공백이 있을 수 있고, 이것은 원래 메시지에도 포함되어야 한다.
출력
각 테스트 케이스에 대해서 한 줄에 하나씩 원래 메시지를 출력한다.
해석
라인 단위로 입력을 받기 때문에 cin대신 getline을 사용해야 한다.
알파벳의 개수가 26개 이므로 길이가 26인 배열을 이용하여 풀면 쉽게 풀 수 있다.
0번째 자리는 A를 바꿔주는 규칙, 1번째 자리는 B를 바꿔주는 규칙... 26번째 자리는 Z를 바꿔주는 규칙으로 사용한다.
코드
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
|
#include <iostream>
#include <string>
using namespace std;
char alpa[26];
//A = 65
int main() {
int t;
string n;
string rule;
cin >> t;
getline(cin, n);
while (t--) {
getline(cin, n);
cin >> rule;
for (int i = 0; i < rule.size(); i++) {
alpa[i] = rule[i];
}
for (int i = 0; i < n.size(); i++) {
if (n[i] == ' ') {
cout << ' ';
}
else {
cout << alpa[n[i] - 65];
}
}
cout << '\n';
getline(cin, n);
}
}
|
cs |
Memo
getline에 대해 공부할 수 있었던 문제다.
cin은 개행문자 전까지 읽고 처음에 나오는 개행문자는 무시한다.
getline은 개행문자까지 읽고 처음에 나오는 개행문자도 읽는다.
그렇기 때문에 cin으로 N값을 입력받은 후 남아있는 개행문자를 읽어주기 위한 getline을 한번 호출해줘야 한다.
이것은 마지막 라인에도 똑같이 적용된다.
'A'는 아스키 코드로 65이다.