새소식

프론트엔드 공부/자료구조 & 알고리즘

암호화된 문자열과 암호화 키를 입력받아 복호화된 문자열을 리턴해야 합니다.카이사르 암호(Caesar cipher)는 평문(plaintext)을 암호키 secret개만큼 (오른쪽으로) 평행이동시켜 암호화 합니다. 복..

  • -

decryptCaesarCipher

문제

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

'hello'를 secret 3으로 암호화한 경우: 'khoor'
'codestates'를 secret 11로 암호화한 경우: 'nzopdelepd'

입력

인자 1 : str

  • string 타입의 알파벳 소문자 문자열

인자 2 : secret

  • number 타입의 암호화 키

출력

  • string 타입을 리턴해야 합니다.

주의 사항

  • 빈 문자열을 입력받은 경우, 빈 문자열을 리턴해야 합니다.
  • 공백은 그대로 두어야 합니다.

입출력 예시

let output = decryptCaesarCipher('khoor', 3);
console.log(output); // --> hello

output = decryptCaesarCipher('zruog', 3);
console.log(output); // --> world

코드

// 작성코드 참고
function decryptCaesarCipher(str, secret) {
  /**
   * 1. 카이사르 암호로 된 str을 입력받는다.
   * 2. str을 복호화한다.
   *   - alphabet -> 알파벳 집합을 배열로 선언 , 초기화한다.
   *   - str을 순회한다.
   *   - 순회하면서 str[i] 에 접근한다.
   *   - alphabet.indexOf(str[i])를 이용해 alphabet에 속한 index를 얻어낸다.
   *   - 
   *   - 얻어낸 index를 이용해 secret를 빼줌으로써 복호화된 문자열을 구한다.
   *   - 생각해줘야 할 예외
   *     - index - secret 이 음수가 나올 경우 : alphabet[0] 에서 alphabet[25]로 이동해야함.
   *   - newStr += alphabet[index - secret];
   * 3. 복호화한 newStr을 리턴한다.
   */
 // 알파벳 배열을 정의합니다.
 const alphabet = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'];

  let idx = 0;  // idx는 알파벳 배열에서의 인덱스를 나타냅니다.
  let newArr = '';  // 복호화 된 문자열을 저장할 변수를 정의합니다.

  // 문자열의 각 문자에 대해 반복합니다.
  for(let i = 0; i < str.length; i++){
    if(str[i] === ' '){  // 공백인 경우
      newArr += ' ';  // 공백을 그대로 저장합니다.
    }else{
      // 각 문자의 알파벳 배열에서의 인덱스를 구합니다.
      idx = alphabet.indexOf(str[i]);

      // idx - secret이 0 이상인 경우
      if(idx-secret >= 0){  
        // idx-secret에 해당하는 알파벳을 newArr에 저장합니다.
        newArr += alphabet[idx-secret];
      }else{
        // idx - secret이 0 미만인 경우
        // 26+(idx-secret)에 해당하는 알파벳
        // 알파벳을 newArr에 저장합니다.
        newArr += alphabet[26+(idx-secret)];
      }
    }
  }
  // 복호화 된 문자열을 반환합니다.
  return newArr;
}

// 작성코드2
function decryptCaesarCipher(str, secret) {
  const alphabet = 'abcdefghijklmnopqrstuvwxyz'.split('');
  let decrypted = '';

  for (let i = 0; i < str.length; i++) {
    let char = str[i];
    if (char === ' ') {
      decrypted += ' ';
    } else {
      let index = alphabet.indexOf(char);
      let newIndex = (index - secret + 26) % 26;
      decrypted += alphabet[newIndex];
    }
  }

  return decrypted;
}

// 레퍼런스
function decryptCaesarCipher(str, secret) {
  // 알파벳
  let alpha = 'abcdefghijklmnopqrstuvwxyz';

  let result = '';
  for (let i = 0; i < str.length; i++) {
    if (str[i] === ' ') {
      // 공백은 그대로 둔다.
      result = result + ' ';
    } else {
      // 현재 문자의 알파벳 순서를 구한다.
      let asis = alpha.indexOf(str[i]);
      // 복호화는 반대 방향으로 이루어기 때문에 seceret을 뺀다.
      let tobe = (asis - secret + alpha.length) % alpha.length;
      result = result + alpha[tobe];
    }
  }

  return result;
}
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.