(C++) 백준 1855번 - 암호

코딩너구리·2025년 10월 5일

코딩 문제 풀이

목록 보기
16/266

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;
}

후기

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

0개의 댓글