https://www.acmicpc.net/problem/1718
코드
#include <stdio.h>
#include <string.h>
int main()
{
char string[30001];
scanf("%[^\n]s", &string);
int len = strlen(string);
char key[300001];
scanf("%s", &key);
int keyLen = strlen(key);
for (int i = 0; i < len; i++)
{
if (string[i] == ' ') printf(" ");
else
{
int move = key[i % keyLen]-'a';
int point = string[i]-'a';
if (point - move > 0) printf("%c", point-move+'a'-1);
else printf("%c", 'z' + point - move);
}
}
return 0;
}
코드 설명
먼저 평문을 입력받는다. 공백을 포함해서 입력받아야 하므로, 엔터키가 나오기 전까지 입력받는다. 평문의 길이를 len으로 저장한다. 다음으로 암호화 키를 입력받고 키의 길이를 keyLen으로 저장한다.
평문의 길이만큼 반복문을 돈다. 만약 공백을 만나면 바로 공백을 출력한다. 공백이 아닌 경우에는 순서를 얼마만큼 돌려야하는지를 저장하는 move변수에 key[i%keyLen]-'a'를 저장한다. (암호화키는 평문의 길이만큼 계속 반복되므로 암호화키의 어떤 문자가 사용되어야 하는지를 구한다. 구해진 아스키코드에서 a를 빼서 이동할 값을 0~25 사이로 구한다.)
평문의 문자도 a를 빼서 0~25 사이의 정수를 point에 저장한다. point에서 move를 빼서 암호화 후의 문자를 구하는데, 결과가 a 이전의 문자가 되지 않는다면 point-move+'a'-1의 결과를 문자 형태로 출력한다. point-move의 값이 음수라면 변형된 문자가 'a' 이전의 문자가 된 것이므로 z에 그 값을 더해서 결과를 출력한다.
느낀 점
비게네르 암호를 아는 상태에서 본 문제라서 반가웠다. 원리를 알고 있어서 바로 코드를 작성해서 풀었다.
'PS (C, C++)' 카테고리의 다른 글
[백준/C & C++] 1453 피시방 알바 (0) | 2022.08.26 |
---|---|
[백준/C & C++] 1225 이상한 곱셈 (0) | 2022.08.24 |
[백준/C] 1547 공 (0) | 2022.08.22 |
[백준/C] 1076 저항 (0) | 2022.08.22 |
[백준/C] 1085 직사각형에서 탈출 (0) | 2022.08.22 |