문제
매일 밤, 정인이는 상근이에게 이메일을 보낸다. 정인이는 자신의 이메일이 해킹당할 수도 있다는 생각에, 내용을 항상 암호화해서 보낸다.
정인이가 사용하는 암호 알고리즘은 다음과 같다. 정인이가 보내는 메시지는 총 N글자이다.
먼저, 정인이는 R<=C이고, R*C=N인 R과 C를 고른다. 만약, 그러한 경우가 여러 개일 경우, R이 큰 값을 선택한다.
그 다음, 행이 R개고, 열이 C개인 행렬을 만든다.
이제 메시지를 행렬에 옮긴다. 첫 번째 행의 첫 번째 열부터 C번째 열까지 메시지를 순서대로 옮긴 뒤, 남은 메시지는 두 번째 행, 세 번째 행,... R번째 행에 첫 번째 행을 채운 방법과 동일한 순서대로 옮긴다.
행렬에 모두 메시지를 옮겼다면, 이 것을 첫 번째 열의 첫 번째 행부터 R번째 행까지 차례대로 읽으면서 다시 받아 적는다. 그 다음에, 두 번째 열, 세 번째 열,..., C번째 열에 쓰여 있는 문자를 첫 번째 열을 읽은 방법과 동일하게 받아적는다.
상근이는 매일 밤 정인이의 메시지를 해독하는데 지쳤다. 정인이의 암호 이메일이 주어졌을 때, 이를 해독하는 프로그램을 작성하시오.
입력
첫째 줄에 상근이가 받은 메시지가 주어진다. 이 메시지는 알파벳 소문자로만 이루어져 있고, 최대 100글자이다.
출력
첫째 줄에 상근이가 받은 메시지를 해독한 메시지를 출력한다.
예제 입력 1 복사
bok
예제 출력 1 복사
bok
예제 입력 2 복사
koaski
예제 출력 2 복사
kakosi
예제 입력 3 복사
boudonuimilcbsai
예제 출력 3 복사
bombonisuuladici
정인이는 원래 "bombonisuuladici"를 보내려고 했다. 이 메시지는 16글자이므로, 정인이는 1*16, 2*8, 4*4 행렬을 선택할 수 있다. R이 가장 큰 것은 4*4이므로, 4*4를 선택한다.
정인이가 만든 행렬은 다음과 같을 것이다.
b | o | m | b |
o | n | i | s |
u | u | l | a |
d | i | c | i |
문제풀이
처음의 문제를 글로만 읽었을 때 이해가 안되어 혼란스러웠는데, 나같은 사람을 위해 만드신 아래의 표를 보고서야 쉽게 이해할 수 있었다.
해야하는 것은 아래와 같다.
1. 입력받은 문자열의 길이 파악하기
2. 문제에서 주어진 r과 c를 만족하는 행렬 크기 찾기
3. 문제의 조건처럼 행과 열을 바꾸어 출력하기
일단 1번은 #include <cstring> 헤더파일의 strlen함수를 이용했다.
2번을 위해 1번을 구했다고 할 수 있는데, 1번에서 구한 문자열의 길이를 a라고 했을 때, 어쨌든 r*c=a를 만족시켜야 하므로 임의의 변수 i과 j를 이용해 각각 a 이하일 때까지 반복문을 돌려 만약 i*j=a인 순간에 i<j까지 만족했다면 r=i, c=j로 치환하였다.(문제의 조건을 참고하면 된다.)
3번은 의외로 간단하다. 반복문을 이용해 입력된 문자열을 2차원 배열에 넣어주면된다. 주의할 점은 문제의 조건대로 출력시에는 i와 j의 순서 즉 행과 열의 순서를 바꿔서 출력해야 한다는 것이다.
코드
'Koala - 7기 > 기초 알고리즘 스터디' 카테고리의 다른 글
[백준/c] 1408 24 (0) | 2022.07.31 |
---|---|
[백준/c++] 10974 모든순열 (0) | 2022.07.31 |
[백준 / Python] 2789 - 유학 금지 (0) | 2022.07.31 |
[백준/Python] 3059 등장하지 않는 문자의 합 (0) | 2022.07.30 |
[백준/Python]6996 애너그램 (0) | 2022.07.30 |