decryptCaesarCipher

이용만·2023년 3월 31일
0

문제
암호화된 문자열과 암호화 키를 입력받아 복호화된 문자열을 리턴해야 합니다.
카이사르 암호(Caesar cipher)는 평문(plaintext)을 암호키 secret개만큼 (오른쪽으로) 평행이동시켜 암호화 합니다. 복호화는 암호화된 문자열을 원래의 평문으로 복원하는 것을 말합니다.
ex)
'hello'를 secret 3으로 암호화한 경우: 'khoor'
'codestates'를 secret 11로 암호화한 경우: 'nzopdelepd'

public class Solution { 
	public String decryptCaesarCipher(String str, int secret) {
    //알파벳을 모두 String으로 선언, 할당합니다.
    String alpha = "abcdefghijklmnopqrstuvwxyz";

    //결과를 담을 String을 선언합니다.
    String result = "";

    //입력된 str만큼 순회하며
    for(int i = 0; i < str.length(); i++) {
      //해당 문자열이 공백일 경우
      if(str.charAt(i) == ' ') {
        //결과에 공백을 그대로 추가합니다.
        result = result + str.charAt(i);
      } else {
        //이외의 경우, alpha에서 현재 문자열의 index를 찾아준 이후, indexOf는 특정 문자나 문자열이 앞에서부터 처음 발견되는 인덱스를 반환
        int asis = alpha.indexOf(str.charAt(i));
        //복호화는 반대 방향으로 이루어기 때문에 seceret을 빼주게 됩니다.
        //전체 길이를 더하고, 나머지를 구하는 이유는 해당 문자열의 index를 벗어날 경우를 고려한 계산식입니다.
        int tobe = (asis - secret + alpha.length()) % alpha.length();
        //복호화한 문자열을 result에 추가합니다.
        result = result + alpha.charAt(tobe);
      }
    }
    //복호화된 문자열이 저장된 변수를 리턴합니다.
    return result;
  }
}

아래 코드는 내가 했던 방식이다. 실행시켜보니 ArrayIndexOutOfIndexException이 발생했다.
digits[j-secret] 이 코드에서 에러가 발생하는 것인데, 이 문제를 해결할 방법이 도무지 생각이 나지 않았다..

// public class Solution { 
// 	public String decryptCaesarCipher(String str, int secret) {
//     // TODO: 해당 문자의 secret만큼 숫자를 뒤로 옮겨겨 문자를 바꾼다.
//     String digit = "abcdefghijklmnopqrstuvwsyz";
//     char[] digits = digit.toCharArray();

//     // str을 char형 배열로 만든다.
//     char[] words = str.toCharArray();

//     String newStr = "";
//     //반복문을 str.length만큼 돌린다.
//     for(int i=0; i<words.length; i++){
//       //반복문을 digits의 개수 만큼 돌린다.
//       for(int j=0; i<digits.length; j++){
//         // if(char형 배열에서의 요소와 digits 배열에서의 같은 문자를 찾으면)
//         if(words[i] == digits[j]){
//           // digits의 i번째 길이에서 secret 만큼 뺀 문자를 새로운 문자열에 넣는다.
//           newStr = newStr + digits[j-secret];
//         }
//       }
//     }return newStr;
// 	} 
// }
profile
성장하는 개발자가 되고자 합니다.

0개의 댓글