[백준] PS/Java [실랜디]
[백준 2149] 암호해독 - JAVA
SH3542
2025. 5. 1. 16:21
https://www.acmicpc.net/problem/2149
문자열/정렬 문제
문제를 대충 읽으면 낭패본다.
1. 문제 설명은 암호화에 관한 것이고, 출력은 복호화를 요구한다.
2. 평문은 가로를 기준으로 구성하고, 암호문은 세로를 기준으로 구성해야 한다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Comparator;
class Main {
static class E {
int num;
char alpha;
char[] chars;
E(int num, char alpha, char[] chars) {
this.num = num;
this.alpha = alpha;
this.chars = chars;
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String key = br.readLine();
String str = br.readLine();
int K = key.length();
int S = str.length();
int C = S / K;
E[] arr = new E[K];
for (int i = 0; i < K; i++) {
arr[i] = new E(i, key.charAt(i), new char[C]);
}
// key sort
Arrays.sort(arr, Comparator.comparing(e -> e.alpha));
int st = 0;
int ed = C;
// sorted key에 열 기준 맵핑
for (int i = 0; i < K; i++) {
String slice = str.substring(st, ed);
for (int j = 0; j < C; j++) {
arr[i].chars[j] = slice.charAt(j);
}
st += C;
ed += C;
}
// key 복원
Arrays.sort(arr, Comparator.comparing(e -> e.num));
// 복원된 key에 행 기준 맵핑
StringBuilder sb = new StringBuilder();
for (int i = 0; i < C; i++) {
for (int j = 0; j < K; j++) {
sb.append(arr[j].chars[i]);
}
}
System.out.println(sb);
}
}