문제
선영이는 남자친구를 위해 연애 편지를 썼다. 선영이는 편지가 남들에게 읽히는 것을 막기 위해서 편지를 암호화하려고 한다.
먼저, 편지의 내용을 정사각형에 작성한다. 그 다음, 시계방향으로 90도 회전시킨다. 그 다음, 첫 행부터 마지막 행까지 순서대로 다시 편지를 작성한다. 선영이는 싸이월드 세대이기 때문에, 편지에 띄어쓰기를 쓰지 않는다.
예를 들어, 편지의 내용이 "RosesAreRedVioletsAreBlue"인 경우에, 암호화한 편지는 "eedARBtVrolsiesuAoReerles" 이 된다.
선영이가 암호화한 편지가 주어졌을 때, 원래 내용을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 테스트 케이스의 개수가 주어진다. 테스트 케이스의 수는 최대 100개이다.
각 테스트 케이스는 한 줄로 이루어져 있으며, 암호화된 편지가 주어진다. 편지는 알파벳 소문자와 대문자로만 이루어져 있으며, 길이는 1보다 크거나 같고, 10,000보다 작거나 같으며, 항상 제곱수이다.
출력
각 테스트 케이스마다 원래 메시지를 출력한다.
Solved.ac 레벨
실버 V
풀이
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int t;
cin >> t;
while(t--){
string str, ans;
cin >> str;
int len = sqrt(str.length());
char arr[len][len];
for(int i = 0; i < len; i++){
for(int j = 0; j < len; j++){
arr[i][j] = str[j + (len * i)];
}
}
for(int j = len - 1; j >= 0; j--){
for(int i = 0; i < len; i++){
ans += arr[i][j];
}
}
cout << ans << '\n';
}
return 0;
}
cmath 헤더의 sqrt 함수를 사용하면 실수형태로 제곱근을 구할 수 있다. 문제에서 편지의 길이는 항상 제곱수라고 하였기 때문에 편지 문자열을 담을 배열의 크기로 편지의 길이의 제곱근을 사용하기 위해 사용하였다.
첫 번째 for문에서는 입력받은 문자열을 문제의 이미지와 동일한 형태로 담아주었고 두 번째 for문에서는 복호화를 위한 위치부터 문자열 변수에 저장하였다.
출력 방법 보다는 입력받은 편지를 문제의 이미지와 동일한 형태로 담는 방법을 고민하는 데에 시간을 가장 많이 쓴 것 같다.
'Study (etc) > Problem Solving' 카테고리의 다른 글
[BOJ / C++] 10039번 : 평균 점수 (1) | 2022.12.28 |
---|---|
[BOJ / C++] 10826번 : 피보나치 수 4 (0) | 2022.12.26 |
[BOJ / C++] 26307번 : Correct (0) | 2022.12.21 |
[BOJ / C++] 26545번 : Mathematics (0) | 2022.12.20 |
[BOJ / C++] 26574번 : Copier (0) | 2022.12.20 |