[String] 복호화

박채은·2022년 12월 14일
0

코딩테스트

목록 보기
9/52

문제

[코플릿 - decryptCaesarCipher]


내가 작성한 코드

public class Solution {
    public static String decryptCaesarCipher(String str, int secret) {
        String result="";
        if(str.length()==0) return result;

        // 복호화 - secret 만큼 앞당져줘야 한다.
        for(int i=0;i<str.length();i++){
            if(str.charAt(i) == ' '){
                result+= " ";
                continue;
            }
            char c = (char) (str.charAt(i) - secret);
            if(c < 'a'){ // z로 순환
                c = (char)('z' - (secret -1 - (str.charAt(i)-'a')));
            }
            result+= c;
        }
        return result;
    }
}
  • 암호를 복호화하기 위해서는 secret만큼 왼쪽으로 평행이동 시켜야 한다.
  • 암호는 소문자로만 이뤄져 있기 때문에 a를 벗어나게 되면 z로 돌아가 순환한다.

ex) 만약 현재 문자가 d이고 secret이 7인 경우에,
d -> c -> b -> a -> z -> y -> x -> w
a에서 z로 순환하여 w가 된다.


레퍼런스 코드

public class Solution {
    public static String decryptCaesarCipher(String str, int secret) {
        String alpha = "abcdefghijklmnopqrstuvwxyz";
        String result="";
        if(str.length()==0) return result;

        // 복호화 - secret 만큼 앞당져줘야 한다.
        for(int i=0;i<str.length();i++){
            if(str.charAt(i) == ' '){
                result += " ";
                continue;
            }
            int as_is = alpha.indexOf(str.charAt(i)); // 현재 위치
            // index를 벗어날 경우에 순환
            int to_be = (as_is - secret + alpha.length()) % alpha.length();
            result += alpha.charAt(to_be);
        }
        return result;
    }
}

  • a를 벗어나게 되면 z로 돌아가 순환하는 것을 코드로 표현하면 다음과 같다.

순환 시에는 모듈러 연산자 사용

int to_be = (as_is - secret + alpha.length()) % alpha.length();
  • as_is : 암호 문자의 위치
  • to_be : 복호화된 문자의 위치

(1) as_is - secret >= 0 : a를 벗어나지 않는 경우
(2) as_is - secret < 0 : a를 벗어나 순환하는 경우
로 볼 수 있다.

|as_is - secret|(절댓값)을 x (x >= 0)라고 하면,

(1)의 경우에는, (alpha.length() + x) % alpha.length() = x 이고,
(2)의 경우에는, (alpha.length() - x) % alpha.length() = alpha.length() - x이다.


나의 코드도 나쁘진 않지만, if문을 추가하는 대신에 하나의 일반화된 식으로 표현하고 싶었다.
순환하는 경우는 모듈러 연산자를 사용하여 간단하게 식으로 표현할 수 있다.

0개의 댓글