본문 바로가기
CS(Computer Science)지식/[C++][코딩 테스트] 자료구조 및 알고리즘

[C++] 백준 2999번: 비밀 이메일

by 엔지니어 청년 2024. 2. 4.

문제 링크

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