본문 바로가기
Developer/Algorithm

Programmers 프로그래머스 코딩테스트 연습 - 시저 암호 (JavaScript)

by roqkfrlfhr 2020. 8. 16.

Programmers 프로그래머스 코딩테스트 연습 - 시저 암호 (JavaScript)

 

Programmers(프로그래머스)의 코딩테스트 연습문제 Level 1 중,

시저 암호 문제를 JavaScript로 해결해 보도록 하겠습니다.

 

 

문제 설명

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

 

제한 조건

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

 

입출력 예

s n result
"AB" 1 "BC"
"z" 1 "a"
"a B z" 4 "e F d"

 

 

작성한 답

solution.js

function solution(s, n) {
    return s.replace(/[a-z]/ig, c => c.charCodeAt() >= 97 ? String.fromCharCode(97+(c.charCodeAt()+n)%123%97) : String.fromCharCode(65+(c.charCodeAt()+n)%91%65));
}

 

설명

어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식인 시저 암호를 만들어주는 함수를 작성하는 문제입니다.

소문자는 밀다가 "z" 다음에는 다시 "a"로 돌아오고, 대문자는 밀다가 "Z" 다음에는 다시 "A"로 돌아와야하며, 공백은 몇번을 밀어도 공백이기 때문에 공백은 그대로 두는 것과 같은 것이라 볼 수 있습니다.

그러므로 Parameter로 받는 문자열 s에서 대문자와 소문자를 구분하지않고 영문자기만 하면 변경되도록 replace 함수를 사용하고,

정규식 /[a-z]/ig 을 사용해 a부터 z까지 모든 영문자를 대문자와 소문자를 구분하지않고 선택하게 합니다.

그리고 변경할 값은 선택되는 각 단어가 소문자인지 대문자인지를 Unicode로 먼저 구분 해줍니다.

대문자의 시작 'A'와 마지막 'Z', 소문자의 시작 'a'와 마지막 'z'의 Unicode를 먼저 알려드리자면 아래 표를 참조해주시기 바랍니다.

영문자 Unicode
'A' 65
'Z' 90
'a' 97
'z' 122

즉 선택되는 단어가 소문자인지 대문자인지를 구분하려면 Unicode가 97 이상인지 확인하면 됩니다.

그러므로 먼저 선택된 단어를 charCodeAt()으로 Unicode로 변환한 다음 97 미만이면 대문자, 이상이면 소문자인 것을 판단할 수 있습니다.

이제 소문자라면 선택 단어의 Unicode에 몇번 미는지 담겨있는 Parameter n을 더한 뒤 소문자의 마지막인 'z'의 Unicode에 해당하는 122에 1을 더한 123을 나눈 나머지에 다시 소문자의 시작인 'a'의 Unicode에 해당하는 97을 나눈 나머지에 다시 97을 더해줍니다.

대문자라면 선택 단어의 Unicode에 몇번 미는지 담겨있는 Parameter n을 더한 뒤 대문자의 마지막인 'Z'의 Unicode에 해당하는 90에 1을 더한 91을 나눈 나머지에 다시 대문자의 시작인 'A'의 Unicode에 해당하는 65을 나눈 나머지에 다시 65을 더해줍니다.

그리고 해당 Unicode를 fromCharCode()를 통해 문자로 변경해주면 n번 밀어낸 문자가 됩니다.

(장황한 설명 죄송합니다..)

 

 

 

도움이 되셨다면 공감, 댓글 부탁드립니다!

궁금하신 점이나 요청 사항은 언제든지 말씀 해주세요!

 

감사합니다.


댓글