감전우 2019. 10. 13. 20:56

문제: Encryption

난이도: Medium

 

문제 설명

 다음의 암호화 방식으로 영어 문자열을 암호화해야 한다. 먼저, 문자열에서 띄어쓰기를 제거하고 그 문자열의 길이를 L이라 한다. 그 후 문자들은 행과 열이 다음의 제약을 가진 격자 안에 적힌다.

 

L 내림한 L 올림한

 

 예를 들어, 문장 s = have a nice dayhavaniceday로 변환되고, L=12, L 34 사이의 값이므로 행이 3, 열이 4인 격자 안에 쓰여져서 다음과 같게 된다.

have

anic

eday

 

 이 격자에 쓰인 문자를 왼쪽부터 세로로 읽고 각각의 덩어리를 띄어쓰기를 하면 암호화가 완료된다.

 

hae and via ecy

 

 , × ≥ L  이어야 하고, 이를 만족하는 가장 작은 영역을 사용해야 한다.

 

문제 해결

소스 코드

    static String encryption(String s) {

        String noSpace = s.replaceAll(" ", "").trim();

        int len = noSpace.length();

        int row = (int)Math.floor(Math.sqrt(len));

        int column = (int)Math.ceil(Math.sqrt(len));

        List<String> cutStr = new ArrayList<String>();

        StringBuffer buff = new StringBuffer("");

 

        if(row * column < len) {

            row++;

        }

 

        for(int i = 0; i < row; i++) {

            if((i * column + column) > len) {

                cutStr.add(noSpace.substring(i * column));

            } else {

                cutStr.add(noSpace.substring(i * column, i * column + column));

            }

        }

 

        for(int i = 0; i < column; i++) {

            for(int j = 0; j < cutStr.size(); j++) {

                if(i < cutStr.get(j).length()) {

                    buff.append(cutStr.get(j).charAt(i));

                }

            }

            buff.append(" ");

        }

       

        return buff.toString();

    }

 

해설

 띄어쓰기 없애기, 행과 열 구하는 법은 문제에서 설명한 대로 구현하면 된다.

 띄어쓰기를 없앤 문자열을 열의 크기만큼 잘라내어 배열이나 리스트에 저장하고, 이 배열이나 리스트에서 각 요소의 n번째 문자만 뽑아내어 합치고 띄어쓰기 한 칸 추가하는 것을 반복하면 해결된다.