문제
매일 밤, 정인이는 상근이에게 이메일을 보낸다. 정인이는 자신의 이메일이 해킹당할 수도 있다는 생각에, 내용을 항상 암호화해서 보낸다.
정인이가 사용하는 암호 알고리즘은 다음과 같다. 정인이가 보내는 메시지는 총 N글자이다.
먼저, 정인이는 R<=C이고, R*C=N인 R과 C를 고른다. 만약, 그러한 경우가 여러 개일 경우, R이 큰 값을 선택한다.
그 다음, 행이 R개고, 열이 C개인 행렬을 만든다.
이제 메시지를 행렬에 옮긴다. 첫 번째 행의 첫 번째 열부터 C번째 열까지 메시지를 순서대로 옮긴 뒤, 남은 메시지는 두 번째 행, 세 번째 행,... R번째 행에 첫 번째 행을 채운 방법과 동일한 순서대로 옮긴다.
행렬에 모두 메시지를 옮겼다면, 이 것을 첫 번째 열의 첫 번째 행부터 R번째 행까지 차례대로 읽으면서 다시 받아 적는다. 그 다음에, 두 번째 열, 세 번째 열,..., C번째 열에 쓰여 있는 문자를 첫 번째 열을 읽은 방법과 동일하게 받아적는다.
상근이는 매일 밤 정인이의 메시지를 해독하는데 지쳤다. 정인이의 암호 이메일이 주어졌을 때, 이를 해독하는 프로그램을 작성하시오.
입력
첫째 줄에 상근이가 받은 메시지가 주어진다. 이 메시지는 알파벳 소문자로만 이루어져 있고, 최대 100글자이다.
출력
첫째 줄에 상근이가 받은 메시지를 해독한 메시지를 출력한다.
풀이 과정
먼저, R과 C의 값을 구해 행렬을 만들어야 한다. N은 최대 100글자이니, R <= C 조건을 만족할 때 R의 최대값은 10 x 10 = 100 이므로, R의 값은 1부터 탐색하여 구한다.
R x C 행렬을 만들어 문자열을 순차적으로 가로로 옮긴 후, 세로로 읽는 것이 암호화 방식인데, 이를 해독해야 하니 세로로 옮긴 후 가로로 읽어야 한다.
C
#include <stdio.h>
#include <string.h>
int main(void) {
char str[105];
scanf("%s", str);
int r = 1, c = strlen(str);
for (int i = 2; i <= strlen(str); i++) {
if (strlen(str) % i == 0 && i <= strlen(str) / i) {
r = i;
c = strlen(str) / i;
}
}
char arr[100][100];
int cnt = 0;
for (int j = 0; j < c; j++) {
for (int i = 0; i < r; i++) {
arr[i][j] = str[cnt++];
}
}
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
printf("%c", arr[i][j]);
}
}
return 0;
}
Python
import sys
import math
input = sys.stdin.readline
string = input().rstrip()
max_idx = 0
for i in range(1, int(math.sqrt(len(string)))+1):
if len(string) % i == 0 and i <= math.sqrt(len(string)):
max_idx = max(max_idx, i)
matrix = [['' for _ in range(len(string) // max_idx)] for _ in range(max_idx)]
cnt = 0
for j in range(len(string) // max_idx):
for i in range(max_idx):
matrix[i][j] = string[cnt]
cnt += 1
for i in range(max_idx):
print(''.join(matrix[i]), end='')
'-- 예전 기록 > BOJ' 카테고리의 다른 글
[ BOJ ] 1406 : 에디터 ( SILVER 2 ) / C, Python (0) | 2023.11.26 |
---|---|
[ BOJ ] 11656 : 접미사 배열 ( SILVER 4 ) / C, Python (0) | 2023.11.26 |
[ BOJ ] 17413 : 단어 뒤집기 2 ( SILVER 3 ) / C, Python (0) | 2023.11.25 |
[ BOJ ] 9093 : 단어 뒤집기 ( BRONZE 1 ) / C, Python (0) | 2023.11.24 |
[ BOJ ] 4949 : 균형잡힌 세상 ( SILVER 4 ) / C, Python (0) | 2023.11.24 |