본문 바로가기
👩‍💻 Programming/Coding Test 문제 풀이

[Programmers] level 1: 시저 암호 by JavaScript

by codingBear 2022. 7. 10.
728x90
반응형

 이번 글을 작성하는 데 아래 링크의 포스팅을 참고하였습니다.

 

 

[프로그래머스] level1. 시저 암호 (javascript)

문제 어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 "AB"는 1만큼 밀면 "BC"가 되고, 3만큼 밀면 "DE"가 됩니다. "z"는 1만

zzemal.tistory.com


이번 문제를 풀어 보고 싶다면? 아래 링크를 클릭하세요!

 문제 풀러 가기!

 

 이번 문제는 아스키(ASCII)를 연습하는 데 도움이 된다고 생각한다. 처음에 문제를 풀 때는 charCodeAt() 메서드를 활용하여 문제 푸는 데 활용할 인덱스를 반환하는 것까지는 성공적으로 해냈으나 조건문을 제대로 작성하지 못해 결국 다른 사람의 풀이를 참고하였다. 두 번째 if 문을 보면 index + n이 90 이상인데 index는 90 이하라고 첫 조건에 나와 있다. 이는 문자(c)가 대문자이면서 n만큼 밀었을 때 아스키 표상 소문자 영역(91부터 122까지)으로 넘어간다면 26만큼을 빼주라는 뜻이다. 마찬가지로 122를 초과하면 알파벳 영역이 아니므로 26만큼 빼준다.

 두 번째 해답의 경우 전체적인 풀이법은 비슷한데 코드 작성을 간결히 하기 위해 삼항 연산자의 조건문에 들어가는 문자를 대문자로 변환하고 인덱스 대소관계를 비교했다. 대문자로 바꾼 문자의 인덱스가 90을 초과하면 인덱스 + n한 값에 26을 빼주고 아니라면 그대로 index + n에 해당하는 아스키를 반환한다.

 마지막으로는 아스키를 활용하지 않은 해답인데 알파벳 대문자와 소문자를 담은 배열을 미리 선언하여 해결하는 방법이다. 주어진 문자열을 for 반복문으로 탐색하면서 탐색 중인 문자가 공백일 경우 정답에 공백을 더한다. 그리고 includes() 메서드로 대문자 배열에 탐색 중인 문자가 포함되어 있는지 판별하여 포함한다면 uppper, 아니라면 lower 배열을 chars 변수에 할당한다. 그런 다음 indexOf() 메서드를 활용하여 앞서 정한 배열에서 탐색 중인 문자의 인덱스를 구하고 index 변수에 할당한다. 이때 index의 값이 chars 배열의 길이 이상이라면 index에서 chars 배열의 길이만큼을 빼준 값을 index에 재할당한다. 이렇게 구한 index를 활용하여 정답에 해당 문자를 더하면 올바른 반환값을 구할 수 있다.

 charCodeAt()fromCharCode() 메서드, 아스키에 대한 자세한 사항은 아래 함께 보기의 링크를 참고하길 바란다.

 

Solutions

function solution(s, n) {
  /* My Solution */
  let answer = '';
  for (const c of s) {
    const index = c.charCodeAt(0);
    if (c === ' ') {
      answer += ' ';
    } else if ((index + n > 90 && index <= 90) || index + n > 122) {
      answer += String.fromCharCode(index + n - 26);
    } else {
      answer += String.fromCharCode(index + n);
    }
  }
  return answer;

  /* map() Ver. */
  return s
    .split('')
    .map((val) => {
      if (val === ' ') return val;
      const index = val.charCodeAt();
      return val.toUpperCase().charCodeAt() + n > 90
        ? String.fromCharCode(index + n - 26)
        : String.fromCharCode(index + n);
    })
    .join('');

  /* without ASCII CODE */
  const upper = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  const lower = 'abcdefghijklmnopqrstuvwxyz';
  let answer = '';

  for (let i = 0; i < s.length; i++) {
    const c = s[i];
    if (c === ' ') {
      answer += ' ';
      continue;
    }
    const chars = upper.includes(c) ? upper : lower;
    let index = chars.indexOf(c) + n;
    if (index >= chars.length) index -= chars.length;
    answer += chars[index];
  }

 return answer;
}

함께 보기

 

String.prototype.charCodeAt() - JavaScript | MDN

The charCodeAt() method returns an integer between 0 and 65535 representing the UTF-16 code unit at the given index.

developer.mozilla.org

 

String.fromCharCode() - JavaScript | MDN

The static String.fromCharCode() method returns a string created from the specified sequence of UTF-16 code units.

developer.mozilla.org

 

ASCII - 위키백과, 우리 모두의 백과사전

 

ko.wikipedia.org

 

728x90
반응형

댓글