이 영역을 누르면 첫 페이지로 이동
lucid_dream 블로그의 첫 페이지로 이동

lucid_dream

페이지 맨 위로 올라가기

lucid_dream

다양한 상상을 현실로 만드는 멀티 크리에이터를 꿈꾸고 있습니다 ❤️

[Level 1] 시저 암호

  • 2022.02.25 08:08
  • 📝 문제풀이/프로그래머스
글 작성자: NoHack
728x90

문제 설명

어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 "AB"는 1만큼 밀면 "BC"가 되고, 3만큼 밀면 "DE"가 됩니다. "z"는 1만큼 밀면 "a"가 됩니다. 문자열 s와 거리 n을 입력받아 s를 n만큼 민 암호문을 만드는 함수, solution을 완성해 보세요.

제한 조건

  • 공백은 아무리 밀어도 공백입니다.
  • s는 알파벳 소문자, 대문자, 공백으로만 이루어져 있습니다.
  • s의 길이는 8000이하입니다.
  • n은 1 이상, 25이하인 자연수입니다.

문제 풀이

두 가지의 방법으로 문제를 해결했습니다.

// map 메소드를 이용한 케이스
const solution = (s, n) => {
  const characters = [...s];

  return characters.map((character) => {
    if (character === ' ') return ' ';

    let ascii = character.charCodeAt();
    let crypt = ascii + n;

    // 현재 순회 중인 character가 알파벳 범위 안에 있는지 체크
    if ('a'.charCodeAt() <= ascii && ascii <= 'z'.charCodeAt()) {
      // 암호화를 했는데 범위를 벗어난 경우 값 보정
      if (crypt > 'z'.charCodeAt()) crypt -= 26;
    } else if ('A'.charCodeAt() <= ascii && ascii <= 'Z'.charCodeAt()) {
      // 암호화를 했는데 범위를 벗어난 경우 값 보정
      if (crypt > 'Z'.charCodeAt()) crypt -= 26;
    }

    return String.fromCharCode(crypt);
  }).join('');
};

// 정규 표현식을 이용한 케이스
const solution2 = (s, n) => {
  return s.replace(/\w/g, (character) => {
    let ascii = character.charCodeAt();
    let crypt = ascii + n;

    // 현재 순회 중인 character가 알파벳 범위 안에 있는지 체크
    if ('a'.charCodeAt() <= ascii && ascii <= 'z'.charCodeAt()) {
      // 암호화를 했는데 범위를 벗어난 경우 값 보정
      if (crypt > 'z'.charCodeAt()) crypt -= 26;
    } else if ('A'.charCodeAt() <= ascii && ascii <= 'Z'.charCodeAt()) {
      // 암호화를 했는데 범위를 벗어난 경우 값 보정
      if (crypt > 'Z'.charCodeAt()) crypt -= 26;
    }

    return String.fromCharCode(crypt);
  });
};

const inputs = [
  ['AB', 1],
  ['z', 1],
  ['a B z', 4],
];
inputs.forEach((input) => console.log(solution(...input)));

첫 번째 해결 방법은 매개변수로 받은 문자열을 문자 단위의 배열로 만든 후 각각의 요소를 조작하는 방법입니다. 스프레드 연산자(...)를 문자열과 같은 유사 배열 앞에 사용하게 되면, 문자열의 각 문자를 전개하여 배열로 만들어 줍니다. 그렇게 만든 배열을 map 메소드로 순회하면서, 각 문자를 아스키 코드로 변환하고 범위를 체크하면서 결과를 만들어 내면 됩니다. 문자를 아스키 코드로 변환하고, 아스키 코드를 문자로 변환하는 메소드로는 charCodeAt과 fromCharCode가 있습니다.

그리고 두 번째 해결 방법은 처리 방법이 거의 동일하지만, 문자열을 배열로 만들어 순회하는 것이 아닌 문자열의 일부를 교체하는 replace 메소드의 도움을 받았다는 차이가 있습니다. 이 메소드는 첫 번째 인자로 바꾸고자 하는 부분을 지정하고, 두 번째 인자로 어떻게 바꿀 것인지 지정하면 됩니다. /\w/g는 정규 표현식 매칭 패턴이며, 이 패턴은 "문자열에서 임의의 문자(\w) 한 글자를 찾아 처리할 건데, 일치하는 한 부분만 찾고 끝낼 게 아니라, 이후에도 더 있는지 보고(g: global) 걔네들도 똑같이 처리할 거야."라는 의미를 가지고 있습니다. 패턴을 이렇게 했기 때문에 모든 문자를 대상으로 처리할 수 있습니다.

저작자표시 비영리 동일조건 (새창열림)

'📝 문제풀이 > 프로그래머스' 카테고리의 다른 글

[Level 1] 수박수박수박수박수박수?  (0) 2022.02.25
[Level 1] 문자열을 정수로 바꾸기  (0) 2022.02.25
[Level 1] 약수의 합  (0) 2022.02.25
[Level 1] 이상한 문자 만들기  (0) 2022.02.25
[Level 1] 자릿수 더하기  (0) 2022.02.25

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • [Level 1] 수박수박수박수박수박수?

    [Level 1] 수박수박수박수박수박수?

    2022.02.25
  • [Level 1] 문자열을 정수로 바꾸기

    [Level 1] 문자열을 정수로 바꾸기

    2022.02.25
  • [Level 1] 약수의 합

    [Level 1] 약수의 합

    2022.02.25
  • [Level 1] 이상한 문자 만들기

    [Level 1] 이상한 문자 만들기

    2022.02.25
다른 글 더 둘러보기

정보

lucid_dream 블로그의 첫 페이지로 이동

lucid_dream

  • lucid_dream의 첫 페이지로 이동

검색

메뉴

  • All categories
  • About me
  • Guest Book

카테고리

  • 분류 전체보기 (122)
    • 💦 일상뻘글 (1)
    • ⭐️ 프로젝트 (7)
      • 사이드 프로젝트 (1)
      • 스터디 노트 (6)
    • 🌈 기술스택 (31)
      • Web Basic (10)
      • JavaScript (14)
      • React (0)
      • Git (7)
    • 💻 컴퓨터공학 (28)
      • 자료구조 (13)
      • 알고리즘 (7)
      • 운영체제 (4)
      • 소프트웨어 공학 (4)
    • 📝 문제풀이 (55)
      • 프로그래머스 (55)
      • 과제관 (0)
    • 🐹 취미생활 (0)
      • Film Log (0)
      • Cover Song (0)

댓글

정보

NoHack의 lucid_dream

lucid_dream

NoHack

나의 외부 링크

  • Github
  • Instagram

블로그 구독하기

  • 구독하기
  • RSS 피드

방문자

  • 전체 방문자
  • 오늘
  • 어제

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. Copyright © NoHack.

티스토리툴바