[코플릿 19번] decryptCaesarCipher

아데스티·2023년 2월 12일
0

알고리즘 테스트

목록 보기
7/10

문제

암호화된 문자열과 암호화 키를 입력받아 복호화된 문자열을 리턴해야 합니다.카이사르 암호(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) {
  // TODO: 여기에 코드를 작성합니다.
  if (str === "") return "";

  let arr = str.split("").map((ch) => ch.charCodeAt());
  let newArr = [];

  const blank = " ".charCodeAt();

  for (let i = 0; i < arr.length; i++) {
    if (97 <= arr[i] && arr[i] <= 122 && arr[i] - secret < 97) newArr[i] = 123 - (secret - (arr[i] - 97));
    else if (65 <= arr[i] && arr[i] <= 90 && arr[i] - secret < 65) newArr[i] = 91 - (secret - (arr[i] - 65));
    else if (arr[i] === blank) newArr[i] = blank;
    else newArr[i] = arr[i] - secret;
  }

  return newArr.map((ch) => String.fromCharCode(ch)).join("");
}

아스키코드 변환 메서드
아스키코드 테이블

  1. str을 배열로 만들고 모두 아스키 코드로 변환한 다음 새 배열 arr에 모두 담고
  2. 예외처리를 위해 공백도 아스키코드로 저장 (blank)
  3. 배열의 요소를 secret 만큼 뺀 값으로 새 배열을 채울건데
    3-1) 소문자인 요소의 결과 값이 a(97)보다 작으면 남는 수만큼 z(122) + 1에서 빼도록
    3-2) 대문인 요소의 결과 값이 A(65)보다 작으면 남는 수만큼 Z(90) + 1에서 빼도록
    3-3) 공백이면 공백으로 유지
    3-4) 나머지는 secret 만큼 빼기
  4. 이렇게 담긴 배열을 다시 문자로 변환하고 문자열로 치환
profile
종착지이자 거점 A Destination

0개의 댓글