https://www.acmicpc.net/problem/1855
문제
> 준표와 세준이가 서로의 솔루션을 다른사람이 듣지 못하게 암호화 하여주고받는다.
> 암호화할 문자열을 1,1부터 위에서 아래로 채운 후
다음 열로 넘어가 1,2부터 위에서 아래로 채워 표를만든다.
> 표를 1행부터 왼->오, 오->왼, 왼->오로 읽으며 다시 문자열을 만든다.
> 위 방법을 이용해 암호화된 문자열과 몇열로 이루어졌는지 주어졌을때 원래의 문자열을 구해라.
접근
주어진 문자열을 열의 개수로 나눠 행의 개수를 구한 뒤 암호화되어있는 문자열을 위에서 아래로가 아닌 왼쪽에서 오른쪽으로 배열에 다시 채운다.
이때 짝수 행은 반대로 행하면 초기의 문자열 표가 만들어진다.
새로 만든 문자열을 위에서 아래로 읽으면 처음의 문자열이 나온다.
문제해결
> 입력받은 문자열을 표로 만들기 위해 벡터로 이차원 배열을 선언하고 크기는 입력받은 K와 K로 구한 행으로 지정한다.
> 0행부터라고 생각을 하고 0,짝수행일때는 K*i+j인덱스에 문자를 입력받는다. 0행은 0, 1, 2이고 2행은 6, 7, 8 이런식으로 받아진다.
> 홀수행은 역순으로 받아야하기 때문에 K*i + (k-1-j)인덱스에 넣어준다. 그러면 1행은 5, 4, 3이렇게 나온다.
> 출력은 입력받은 표를 위에서 아래순으로 읽어야 원래 문자열이 나오므로 (0,0), (1,0), (2,0), (0,1), (1,1)..이런식으로 읽어주며 출력한다.
코드
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int K;
cin >> K;
string str;
cin >> str;
int row = str.length() / K;
vector<vector<char>> PW(row, vector<char>(K));
for (int i = 0; i < row; i++)
{
for (int j = 0; j < K; j++)
{
if (i % 2 == 0)
{
PW[i][j] = str[K * i + j];
}
else
{
PW[i][j] = str[K * i + (K - 1 - j)];
}
}
}
for (int i = 0; i < K; i++)
{
for (int j = 0; j < row; j++)
{
cout << PW[j][i];
}
}
return 0;
}

후기
이차원 벡터에 인덱스 정리하는데 머리가 복잡했지만 생각보다쉬웠다.