[백준 11575] Affine Cipher (C#, C++) - soo:bak
작성일 :
문제 링크
설명
주어진 두 정수 a
, b
와 알파벳 대문자로만 구성된 문자열에 대해
아핀 암호 방식으로 암호문을 생성하는 문자열 변환 문제입니다.
암호화 공식은 다음과 같습니다:
\(E(x) = (a \times x + b) \bmod 26\)
(x
는 0부터 25까지의 정수, 'A'
를 0으로 매핑한 문자 인덱스를 의미)
암호화된 정수는 다시 0 → 'A', 1 → 'B', ..., 25 → 'Z'
로 변환됩니다.
접근법
- 테스트케이스 수
T
를 입력받습니다. - 각 테스트케이스마다 두 정수
a
,b
를 입력받고, 암호화할 문자열을 입력받습니다. - 문자열의 각 문자를 다음 방식으로 변환합니다:
- 문자는 내부적으로 아스키(ASCII) 코드 값으로 처리되며,
'A'
의 아스키 값은65
입니다. - 각 문자는
'A'
를 기준으로 정수값으로 변환합니다. (예:'C'
-'A'
에서,'C'
의 아스키 값은67
이므로67
-65
=2
) - 위의 암호화 공식을 적용한 후, 결과에 다시
'A'
의 아스키 값을 더합니다. - 이때
% 26
연산을 통해 변환된 값이 알파벳 범위(0~25)를 넘지 않도록 조정합니다. 이는 알파벳이 총 26글자이기 때문에 적용되는 모듈로 연산입니다. - 최종적으로 0 → ‘A’, 1 → ‘B’, …, 25 → ‘Z’와 같은 방식으로 다시 문자로 변환합니다.
- 문자는 내부적으로 아스키(ASCII) 코드 값으로 처리되며,
- 변환된 문자열을 출력합니다.
Code
[ C# ]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
using System;
class Program {
static void Main() {
int t = int.Parse(Console.ReadLine());
while (t-- > 0) {
var tokens = Console.ReadLine().Split();
int a = int.Parse(tokens[0]), b = int.Parse(tokens[1]);
string str = Console.ReadLine();
char[] arr = str.ToCharArray();
for (int i = 0; i < arr.Length; i++)
arr[i] = (char)((a * (arr[i] - 'A') + b) % 26 + 'A');
Console.WriteLine(new string(arr));
}
}
}
[ C++ ]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t; cin >> t;
while (t--) {
int a, b; cin >> a >> b;
string str; cin >> str;
for (size_t i = 0; i < str.size(); i++)
str[i] = (a * (str[i] - 65) + b) % 26 + 65;
cout << str << "\n";
}
return 0;
}