본문 바로가기

백준/JAVA

[Baekjoon/JAVA] 1855번 - 암호

[백준] Baekjoon Online Judge

문제로 이동

 

문제

준표와 세준이는 서로 솔루션을 토론 하면서 다른 사람이 자신들의 솔루션을 듣지 못하게 하도록 서로 메시지를 주고받을 때 메시지를 암호화 하여서 주고받았다. 암호를 만드는 방법은 다음과 같다. 먼저 암호화 할 문자열을 1,1부터 위에서 아래 순서대로 채운다. 그리고 가장 밑의 행을 채운 후에는 오른쪽 열에서 다시 같은 과정을 반복한다.

만약에 "abcdefghijkl" 이라는 문자열을 3개의 열로 암호화 한다고 하자. 그러면 다음과 같이 표를 채울 수 있을 것이다.

a e i
b f j
c g k
d h l

그런 후에는 이제 왼쪽 → 오른쪽, 오른쪽 → 왼쪽, 왼쪽 → 오른쪽 ... 으로 읽으면서 다시 문자열을 만든다. 위의 경우에는 "aeijfbcgklhd" 가 될 것이다.

우리가 할 일은 다음과 같다. 암호화 된 문자열과 몇 개의 열로 암호화를 하였는지 주어져 있을 때 원래의 문자열을 구하는 프로그램을 작성하여라.

 

입력

열의 개수 K(1 ≤ K ≤ 20)가 주어지고 두 번째 줄에는 암호화 된 문자열(모두 영소문자)이 주어진다. (문자열의 길이는 200 이하이며 K의 배수이다.)

 

출력

첫 줄에 원래의 문자열을 출력한다..

 


예제 입력 예제 출력
3
aeijfbcgklhd
abcdefghijkl

풀이

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);

        int K = in.nextInt(); // 열의 개수
        String s = in.next(); // 암호화 된 문자열

        char arr[][] = new char[s.length() / K + 1][K]; // K개의 열을 가진 문자표

        // 문자표에 문자열 채우기
        for (int i = 0; i < s.length() ; i++) {
            int idx1 = i / K;
            int idx2 = i % K;

            // 문자열은 왼쪽 → 오른쪽, 오른쪽 → 왼쪽로 읽은 결과이기에
            if (idx1 % 2 == 1)
                idx2 = K - 1 - idx2;

            arr[idx1][idx2] = s.charAt(i);
        }

        // 출력
        for (int i = 0; i < K; i++) {
            for (int j = 0; j < s.length() / K; j++)
                System.out.print(arr[j][i]);
        }
    }
}

열의 개수와 암호화된 문자열로 암호화할 때 사용한 표를 다시 만드는 방식으로 문제를 풀었다. 암호화된 문자열은 왼쪽 > 오른쪽, 오른쪽 > 왼쪽 순서로 지그제그로 문자표를 읽은 결과이다. 그렇기에 문자표를 만들 때도 짝수행과 홀수행을 신경써야 한다.

 

짝수행 : arr[0][0] > arr[0][1] > arr[0][2]  즉, arr[짝수][i % K]

홀수행 : arr[1][2] > arr[1][1] > arr[1][0]  즉, arr[홀수][K - 1 - (i % K)]

 

원래의 문자열은 arr[][]를 순서대로 출력하면 된다.

'백준 > JAVA' 카테고리의 다른 글

[Baekjoon/JAVA] 9214번 - 첫 번째 항  (0) 2023.01.25
[Baekjoon/JAVA] 1924번 - 2007년  (0) 2023.01.24
[Baekjoon/JAVA] 1731번 - 추론  (0) 2023.01.22
[Baekjoon/JAVA] 1718번 - 암호  (1) 2023.01.21
[Baekjoon/JAVA] 1681번 - 줄 세우기  (0) 2023.01.20