[백준] 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);
  }
}
댓글수0