😎 κ³΅λΆ€ν•˜λŠ” μ§•μ§•μ•ŒνŒŒμΉ΄λŠ” μ²˜μŒμ΄μ§€?

[BAEKJOON C++] 11575_Affine Cipher λ³Έλ¬Έ

πŸ¦₯ μ½”ν…Œ/BAEKJOON

[BAEKJOON C++] 11575_Affine Cipher

μ§•μ§•μ•ŒνŒŒμΉ΄ 2023. 7. 15. 22:38
728x90
λ°˜μ‘ν˜•
μ„œμͺ½λ‚˜λΌμ—μ„œ νŠΉμˆ˜ν›ˆλ ¨μ„ λ°›μ€ μ •μ€μ΄λŠ” λ™μͺ½λ‚˜λΌλ‘œ μΉ¨νˆ¬λ₯Ό ν•˜κ²Œ λ˜μ—ˆλ‹€. 
λ›°μ–΄λ‚œ μŠ€νŒŒμ΄μ˜€λ˜ μ •μ€μ΄λŠ” λ™μͺ½λ‚˜λΌμ˜ μ •λ³΄λ₯Ό μž…μˆ˜ν•˜κ²Œ λ˜μ—ˆκ³  
정보λ₯Ό μ•ˆμ „ν•˜κ²Œ μ„œμͺ½λ‚˜λΌλ‘œ μ „λ‹¬ν•˜κΈ° μœ„ν•΄ μ•„ν•€ μ•”ν˜Έ(Affine Cipher)λ₯Ό μ΄μš©ν•˜κΈ°λ‘œ ν•˜μ˜€λ‹€.

μ•„ν•€ μ•”ν˜ΈλŠ” λ‹€μŒκ³Ό κ°™μ€ μ‹μ„ ν†΅ν•΄ κ΅¬ν•  μˆ˜ μžˆλ‹€.
E(X) = (aX + b) mod 26

AλΆ€ν„° ZκΉŒμ§€μ˜ μ•ŒνŒŒλ²³μ„ μ°¨λ‘€λŒ€λ‘œ 0, 1, 2, ... , 25 λΌκ³  ν•˜μž.
a = 3이고, b = 1인 κ²½μš°μ— Aλ₯Ό μ•„ν•€ μ•”ν˜Έμ‹μ— λŒ€μž…ν•˜λ©΄ E(0) = (3 × 0 + 1) mod 26 μ΄ λ˜μ–΄ μ•”ν˜Έν™”λœ κ²°κ³ΌλŠ” B

a와 b, κ·Έλ¦¬κ³  μ•ŒνŒŒλ²³ λŒ€λ¬Έμžλ‘œλ§Œ κ΅¬μ„±λœ ν‰λ¬Έμ΄ μ£Όμ–΄μ‘Œμ„ λ•Œ,
이λ₯Ό μ•”ν˜Έλ¬ΈμœΌλ‘œ μΉ˜ν™˜ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜λΌ.

μž…λ ₯
μž…λ ₯의 μ²« μ€„μ—λŠ” ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ˜ κ°œμˆ˜ T(1 ≤ T ≤ 50) κ°€ μ£Όμ–΄μ§„λ‹€.
각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ˜ μ²« λ²ˆμ§Έ μ€„μ—λŠ” λ‘ μ •μˆ˜ a와 b(0 < a, b ≤ 1,000,000)의 κ°’이 μ£Όμ–΄μ§„λ‹€.
aλŠ” 26κ³Ό μ„œλ‘œμ†Œμ΄λ‹€.

각 ν…ŒμŠ€νŠΈμΌ€μ΄μŠ€μ˜ λ‘ λ²ˆμ§Έ μ€„μ—λŠ” ν‰λ¬Έ sκ°€ μ£Όμ–΄μ§„λ‹€. 
ν‰λ¬Έμ˜ κΈΈμ΄ |s|λŠ” 0보닀 ν¬κ³  1,000,000보닀 μž‘λ‹€.

좜λ ₯
각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ§ˆλ‹€ ν•œ μ€„에 ν•œ κ°œμ”© ν‰λ¬Έ sλ₯Ό μ•”ν˜Έλ¬ΈμœΌλ‘œ μΉ˜ν™˜ν•œ κ²°κ³Όλ₯Ό μΆœλ ₯ν•œλ‹€
// [11575] Affine Cipher

/*
μ„œμͺ½λ‚˜λΌμ—μ„œ νŠΉμˆ˜ν›ˆλ ¨μ„ 받은 μ •μ€μ΄λŠ” 동μͺ½λ‚˜λΌλ‘œ 침투λ₯Ό ν•˜κ²Œ λ˜μ—ˆλ‹€. 
λ›°μ–΄λ‚œ μŠ€νŒŒμ΄μ˜€λ˜ μ •μ€μ΄λŠ” 동μͺ½λ‚˜λΌμ˜ 정보λ₯Ό μž…μˆ˜ν•˜κ²Œ λ˜μ—ˆκ³  
정보λ₯Ό μ•ˆμ „ν•˜κ²Œ μ„œμͺ½λ‚˜λΌλ‘œ μ „λ‹¬ν•˜κΈ° μœ„ν•΄ μ•„ν•€ μ•”ν˜Έ(Affine Cipher)λ₯Ό μ΄μš©ν•˜κΈ°λ‘œ ν•˜μ˜€λ‹€.

μ•„ν•€ μ•”ν˜ΈλŠ” λ‹€μŒκ³Ό 같은 식을 톡해 ꡬ할 수 μžˆλ‹€.
E(X) = (aX + b) mod 26

AλΆ€ν„° ZκΉŒμ§€μ˜ μ•ŒνŒŒλ²³μ„ μ°¨λ‘€λŒ€λ‘œ 0, 1, 2, ... , 25 라고 ν•˜μž.
a = 3이고, b = 1인 κ²½μš°μ— Aλ₯Ό μ•„ν•€ μ•”ν˜Έμ‹μ— λŒ€μž…ν•˜λ©΄ E(0) = (3 × 0 + 1) mod 26 이 λ˜μ–΄ μ•”ν˜Έν™”λœ κ²°κ³ΌλŠ” B

a와 b, 그리고 μ•ŒνŒŒλ²³ λŒ€λ¬Έμžλ‘œλ§Œ κ΅¬μ„±λœ 평문이 μ£Όμ–΄μ‘Œμ„ λ•Œ,
이λ₯Ό μ•”ν˜Έλ¬ΈμœΌλ‘œ μΉ˜ν™˜ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜λΌ.

μž…λ ₯
μž…λ ₯의 첫 μ€„μ—λŠ” ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ˜ 개수 T(1 ≤ T ≤ 50) κ°€ 주어진닀.
각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ˜ 첫 번째 μ€„μ—λŠ” 두 μ •μˆ˜ a와 b(0 < a, b ≤ 1,000,000)의 값이 주어진닀.
aλŠ” 26κ³Ό μ„œλ‘œμ†Œμ΄λ‹€.

각 ν…ŒμŠ€νŠΈμΌ€μ΄μŠ€μ˜ 두 번째 μ€„μ—λŠ” 평문 sκ°€ 주어진닀. 
ν‰λ¬Έμ˜ 길이 |s|λŠ” 0보닀 크고 1,000,000보닀 μž‘λ‹€.

좜λ ₯
각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ§ˆλ‹€ ν•œ 쀄에 ν•œ κ°œμ”© 평문 sλ₯Ό μ•”ν˜Έλ¬ΈμœΌλ‘œ μΉ˜ν™˜ν•œ κ²°κ³Όλ₯Ό 좜λ ₯ν•œλ‹€
*/

#define _CRT_SECURE_NO_WARNINGS
// ν‘œμ€€ μŠ€νŠΈλ¦Όμ—μ„œ 읽기 및 μ“°κΈ°λ₯Ό μ œμ–΄ν•˜λŠ” 개체λ₯Ό μ„ μ–Έ
#include <iostream>
#include <algorithm>    // find
#include <string>
#include <cmath>        // abs
using namespace std;

int main() {
	int T;
	cin >> T;

	for (int i = 0; i < T; i++) {
		int a, b;
		string X, newStr;
		cin >> a >> b >> X;
		
		// E(X) = (aX + b) mod 26
		for (int j = 0; j < X.length(); j++) {
			// μ•„μŠ€ν‚€μ½”λ“œ λ³€ν™˜ν•΄μ„œ μˆ˜μ‹ 계산 ν›„ λ‹€μ‹œ 문자둜
			int temp = (char)(((a * ((int)X.at(j) - 65) + b) % 26) + 65);
			newStr += temp;
		}
		cout << newStr << "\n";
	}
}

728x90
λ°˜μ‘ν˜•
Comments