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();
(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문을 추가하는 대신에 하나의 일반화된 식으로 표현하고 싶었다.
순환하는 경우는 모듈러 연산자를 사용하여 간단하게 식으로 표현할 수 있다.