LearnApplyShare

Caesar Cipher

September 01, 2018 - [string, encrypt]

문제

caesar 암호화 방법은 아래와 같다.

숫자 3이 주어 진다면 먼저 아래와 같이 알파벳의 순서를 3칸 rotation 시킨 알파벳 배열을 준비하고

Original alphabet:      abcdefghijklmnopqrstuvwxyz
Alphabet rotated +3:    defghijklmnopqrstuvwxyzabc

평문 문자열에 대하여 각 문자들을 위의 새로운 알파벳 순서 배열의 해당 위치 문자로 변환시킨다.

예) “hello WORLD!”

"hello WORLD!" => "khoor ZRUOG!"

rotation 크기가 k로 주어질 때, 임의 문자열을 암호화하는 caesar 암호화 함수를 완성하라.

js코드

function caesarCipher(s, k) {
  function enc(k) {
    var lower = "abcdefghijklmnopqrstuvwxyz"
    var upper = lower.toUpperCase()

    var encLower = lower.slice(k % 26) + lower.slice(0, k % 26)
    var encUpper = upper.slice(k % 26) + upper.slice(0, k % 26)

    return function encK(c) {
      if (lower.includes(c)) {
        return encLower[lower.indexOf(c)]
      } else if (upper.includes(c)) {
        return encUpper[upper.indexOf(c)]
      } else {
        return c
      }
    }
  }
  var encK = enc(k)
  return s
    .split("")
    .map(c => encK(c))
    .join("")
}

caesarCipher("hello world!", 3)

코드 리뷰

  • 문자열의 일부를 잘라낼 때 slice 함수를 적절히 활용
  • 굳이 그럴 필요는 없었지만 encK 함수를 만들기 위해 enc 고차함수를 활용

Ref.

https://www.hackerrank.com/challenges/caesar-cipher-1/problem