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
'BAEKJOON > 구현' 카테고리의 다른 글
백준 10811번 [바구니 뒤집기](JAVA) -yes6686- 티스토리 (0) | 2025.01.08 |
---|---|
백준 10813번 [공 바꾸기](JAVA) -yes6686- 티스토리 (0) | 2025.01.08 |
백준 2239번 [스도쿠](C++) -yes6686- 티스토리 (0) | 2025.01.04 |
백준 15686번 [치킨 배달](C++)-yes6686- 티스토리 (0) | 2024.12.30 |
백준 17144번 [미세먼지 안녕!](C++)-yes6686- 티스토리 (0) | 2024.12.30 |