[JS]_daily coding #20

seul·2022년 6월 21일
0

Algorithm

목록 보기
19/31

코플릿 19_decryptCaesarCipher


수도코드

  1. 카이사르 암호화된 문자열을 입력받아 복호화된 문자열을 리턴한다.
  2. 카이사르 암호화는 평문을 오른쪽으로 암호키만큼 이동시킨 것이고, 복호화하려면 암호화된 문자열을 왼쪽으로 암호키만큼 이동시키면 된다.
  3. 알파벳 문자열을 선언해주고, 복호화된 문자열을 담을 빈문자열을 선언해준다.
  4. 반복문을 통해서 입력받은 문자열을 인덱스별로 접근한다.
    4-1. 문자열 인덱스가 공백이 아닐 경우, indexOf() 메서드를 이용해서 입력받은 문자열의 현재 (알파벳) 인덱스를 구한다. curIdx
    4-2. 현재인덱스에서 secret만큼 왼쪽으로 이동한 복호화 인덱스를 구한다. -> docodedIdx = curIdx - secret
    4-3. 복호화 결과 문자열에 알파벳문자열의 복호화 인덱스를 담아준다.
  5. 입력받은 문자열 중 공백이 있는 경우는 공백을 그대로 담아준다.
  6. 복호화 결과를 반환한다.

첫번째 코드

function decryptCaesarCipher(str, secret) {
  let alphabet = 'abcdefghijklmnopqrstuvwxyz';
  let decodedStr = ''
  for (let i = 0; i < str.length; i++) {
    if (str[i] !== ' ') {
      let curIdx = alphabet.indexOf(str[i]);
      let docodedIdx = curIdx - secret;
      decodedStr += alphabet[docodedIdx];
    } else {
      decodedStr += ' '
    }
  }
  return decodedStr
}

입력받은 secretcurIdx보다 큰 경우에는 decodedIdx가 음수가 되고 알파벳 문자열의 인덱스 범위를 벗어나게 돼서 제대로 동작하지 않는다. decodedIdx가 음수가 될 경우를 처리해주는 코드를 추가해줘야 한다.
또한, 현재 else 조건에 써준 공백처리 부분은 if문 코드보다 훨씬 간단한 작업이므로 위로 올려주는게 좋다. (공백의 경우 지금 if문을 거칠 필요가 없기 때문)

두번째 코드

function decryptCaesarCipher(str, secret) {
  let alphabet = 'abcdefghijklmnopqrstuvwxyz';
  let decodedStr = ''
  
  for (let i = 0; i < str.length; i++) {
    if (str[i] === ' ') {
      // 공백은 그대로 담아준다. (아래 복호화 과정을 거칠 필요 없음)
      decodedStr += ' '
    } else {
      //현재 문자열의 알파벳 인덱스
      let curIdx = alphabet.indexOf(str[i]);
      //현재 문자열에서 secret만큼 왼쪽으로 이동시킨 것이 복호화 인덱스 
      let docodedIdx = curIdx - secret;
      //복호화 인덱스가 음수인 경우에는 알파벳 길이를 더해준다. (알파벳문자열 인덱스 범위 내로 바꿔준다)
      docodedIdx < 0? docodedIdx = alphabet.length + docodedIdx :  docodedIdx

      decodedStr += alphabet[docodedIdx]
    } 
  }
  return decodedStr
}
profile
Connecting dots

0개의 댓글