encode.js (7kyu 58)

Codewars 알고리즘 풀이


Problem

  • Digital Cypher assigns to each letter of the alphabet unique number.
    • Digital Cypher는 알파벳 고유 번호의 각 문자를 지정한다.
// a  b  c  d  e  f  g  h  i  j  k  l  m
// 1  2  3  4  5  6  7  8  9 10 11 12 13
//  n  o  p  q  r  s  t  u  v  w  x  y  z
// 14 15 16 17 18 19 20 21 22 23 24 25 26


  • Instead of letters in encrypted word we write the corresponding number.
    • 암호화한 문자 대신에, 대응 숫자를 작성한다.
// h  e  l  l  o
// 8  5 12 12 15


  • Then we add to each obtained digit consecutive digits from the key.
    • 그런 다음, 각 digit에 연속적인 digit(key)을 더한다.
//    h  e  l  l  o
//    8  5 12 12 15
// +  1  9  3  9  1
// ----------------
//    9 14 15 21 16


  • Write a function that accepts ‘str’ string and ‘key’ number and returns an array of integers representing encoded ‘str’.
    • 암호화된 str을 나타내는 정수의 배열을 반환한다.
  • The str input string consists of lowercase characters only.
    • str 입력 문자는 소문자로만 구성된다.
  • The key input number is a positive integer.
    • key 입력 숫자는 양수이다.


Solution 01

function encode(str, key) {
  const cypher = {
    a: 1,
    b: 2,
    c: 3,
    d: 4,
    e: 5,
    f: 6,
    g: 7,
    h: 8,
    i: 9,
    j: 10,
    k: 11,
    l: 12,
    m: 13,
    n: 14,
    o: 15,
    p: 16,
    q: 17,
    r: 18,
    s: 19,
    t: 20,
    u: 21,
    v: 22,
    w: 23,
    x: 24,
    y: 25,
    z: 26
  };
  
  key = key.toString();
  str = str.split('');
  let keyIndex = 0;
  let result = [];
  
  str.forEach(i => {
    result.push(cypher[i] + Number(key[keyIndex]));
    
    keyIndex++;
    
    if (keyIndex >= key.length) {
      keyIndex = 0;
    }
  });
  return result;
}

encode('hello', 1939);  // [9, 14, 15, 21, 16]
encode('apple', 1988);  // [2, 25, 24, 20, 6]

forEach(): 배열의 각 element에 대해 제공된 함수를 차례로 한 번씩 호출한다.

split(): 문자열을 부분 문자열로 분할하고, 새 배열로 반환한다.

push(): 배열의 끝에 새 element를 추가하고, 새로운 길이를 반환한다.

toString(): 숫자를 문자열로 변환한다.


Solution 02

function encode(str, key) {
  key = key.toString();
  
  return str.split('').map((i, index) => i.charCodeAt() - 96 + Number(key[index % key.length]));
}

encode('hello', 1939);  // [9, 14, 15, 21, 16]
encode('apple', 1988);  // [2, 25, 24, 20, 6]

map(): 배열 내 모든 element에 대해, 호출한 함수의 결과를 모아 새로운 배열을 반환한다.

charCodeAt(): 문자열의 지정된 index에 있는 문자의 Unicode를 반환한다.