본문 바로가기

BAEKJOON/구현

백준 1855번 [암호](C++) -yes6686- 티스토리

728x90
SMALL

 

백준 문제 풀이: 1855 [암호]


문제 링크: https://www.acmicpc.net/problem/1855

문제 설명:

암호를 해독하기 위해 열쇠 문자열의 길이를 이용하여 암호문을 행렬 형태로 변환하고, 행 순서대로 문자를 출력합니다.

입력 조건:

  • 첫 번째 줄에 열쇠의 길이 n이 주어집니다. (1 ≤ n ≤ 10)
  • 두 번째 줄에 암호문 s가 주어집니다. (길이는 n의 배수, 1 ≤ s 길이 ≤ 100)

출력 조건:

  • 복호화된 결과를 출력합니다.

문제 해결 코드


#include <iostream>
#include <string>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL);

    int n;
    cin >> n;
    string s;
    cin >> s;

    string ps = ""; // 열쇠 길이를 기반으로 재구성된 문자열
    int check = 1;  // 방향 확인 (행 순서대로 or 반대 방향)

    for (int i = 0; i < s.size(); i++) {
        if (i % n == 0) {
            check = (check == 1) ? 0 : 1; // 방향 전환
        }
        if (check == 0) {
            ps += s[i];
        } else {
            int k = i / n;
            int h = i % n;
            ps += s[n * k + (n - h - 1)];
        }
    }

    // 행렬에서 열을 기준으로 복호화
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < ps.size() / n; j++) {
            cout << ps[i + (n * j)];
        }
    }
    return 0;
}
    

코드 설명

위 코드는 암호문을 열쇠의 길이를 기반으로 행렬로 변환하여 복호화합니다.

  • 입력 처리:
    • 열쇠의 길이 n과 암호문 s를 입력받습니다.
  • 행렬 변환:
    • 암호문을 n 길이를 기준으로 행렬 형태로 변환합니다.
    • 행마다 방향을 변경하며 문자를 재구성합니다.
  • 복호화:
    • 재구성된 문자열에서 열을 기준으로 문자를 출력합니다.

시간 복잡도 분석:

  • 암호문 크기 s의 길이에 따라 O(s).
  • 작은 n의 범위 내에서 효율적으로 동작합니다.

결과

다음은 입력 예시와 출력 결과입니다:

입력:
4
ABCDEFGHIJKLMNOP

출력:
AHIPBGJOCFKNDELM

주어진 입력을 기반으로 암호가 올바르게 복호화되었습니다.

다른 접근 방식이나 개선 사항이 있다면 댓글로 공유 부탁드립니다!

728x90
LIST