문제 링크
https://www.acmicpc.net/problem/2999
풀이 방법
위 문제는 정인이가 암호화한 문자열을 다시 해독하는 문제이다 따라서 암호화 하는 과정으로 이해하면 안 되고 해독하는 과정으로 이해해야 한다. 아래 예시를 들어보겠다.
만약 R=2, C=3 인 경우 암호화 된 문자열이 koaski라고 할 때 다음과 같이 3x2 배열의 형태로 변경한다.
ko
as
ki
인덱스가 0인 열부터 전부 읽어 나가면 kakosi가 된다. 이 원리를 이용해서 문제를 쉽게 해결할 수 있다.
위 설명과 아래 코드의 주석을 참고해서 해당 문제를 이해하자!
코드
#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 105;
char arr[MAX_N][MAX_N];
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
string s;
cin >> s;
int n = s.size();
pair<int, int> result = { 1, n };
for (int r = 2; r <= n; ++r) {
if (n % r == 0) {
int c = n / r;
if (r > c) break;
result = { r, c };
}
} // r,c 를 구해서 result vector에 넣는다.
int idx = 0;
int r = result.first, c = result.second;
// 위 for문 조건문에 위배되는 r값과 c값이 들어 있으므로 result에 저장된 값을 이용하여 갱신한다.
for (int j = 0; j < c; ++j) {
for (int i = 0; i < r; ++i) {
arr[j][i] = s[idx++];
}
}
// cXr 배열로 변경한다.
for (int i = 0; i < r; ++i) {
for (int j = 0; j < c; ++j) {
cout << arr[j][i];
}
}
// 열에 존재하는 모든 행을 순차적으로 출력한다.
return 0;
}
'CS(Computer Science)지식 > [C++][코딩 테스트] 자료구조 및 알고리즘' 카테고리의 다른 글
[C++] 백준 15312번: 이름 궁합 (1) | 2024.02.04 |
---|---|
[C++] 백준 9536번: 여우는 어떻게 울지? (0) | 2024.02.04 |
[C++] 백준 1969번: DNA (0) | 2024.02.04 |
[C++] 백준 2870번: 수학숙제 (0) | 2024.02.04 |
[C++] 백준 3613번: Java vs C++ (0) | 2024.02.04 |