카테고리 없음

[알고리즘] 시저암호 javascript javascript

ShinBW 2022. 1. 24. 20:52

문제 설명

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

제한 조건

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

입출력 보면 문제는 쉽다.

알파벳이 있다면 s의 값들을 n번만큼 오른쪽으로 이동하면 답이 나오는 문제

for와 if문 쓰면 끝나겠구나 생각했지만 끝난건 나다.

생각하며 코드를 작성해보아도 진전이 없어 풀이과정을 훔쳐봤더니 아스키 코드를 사용했다고 한다.

파이썬에서 아스키코드로 문제푼것은 본적있는데 자바스크립트도 있나...?

다른방법 풀이를 보며 코드를 적어 내려갔다.

function solution(s, n){
  let upper = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';  //미리 비교 할 대소문자 선언
  let lower = 'abcdefghijklmnopqrstuvwxyz';
  let answer = '';

  for(let i=0; i<s.length; i++) {
    let a = s[i] 
    // console.log(a) //'A', 'B'
    let b = upper.includes(a) ? upper : lower
    // console.log(b)
    let c = b.indexOf(a) // 대문자 혹은 소문자 문자열에서 a(A & B)를 찾아 인덱스 번호 리턴
    // console.log(c)  // 0, 1 
    let d = b[c + n] // 
    console.log('이게 정답' + d)
  }
  return 
}
solution('AB', 1)

이렇게 코드를 짰을때 정답이 나오는듯 했다.
그러나 검사해보면 실패가 뜨며
실패 이유는 리턴에 아무것도 없고, 다른 문제속 공백을 신경 안썻으며 z로 입력 시 값이 안나오는 점이 발견되었다.

문제 정답

function solution(s, n) {
    let upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    let lower = "abcdefghijklmnopqrstuvwxyz";
    let answer= '';

    for(let i =0; i <s.length; i++){
        let text = s[i];
        if(text == ' ') {  // 입력값에 공백이 있을 시 어떻게 처리할지 조건 넣음
            answer += ' '; 
            continue;
        }
        let textArr = upper.includes(text) ? upper : lower;
        let index = textArr.indexOf(text)+n;
        if(index >= textArr.length) index -= textArr.length;  // 만약 더한 인덱스가 할당한 문자열의 길이보다 길거나 같을 경우 인덱스 - 문자열 길이 빼기
        answer += textArr[index]; // 계산한 인덱스에 해당하는 문자 덧셈 
    }
    return answer;
}


console.log(solution('Abc', 1))
console.log(solution(' z ', 2))

아스키 코드로 문제풀기


function solution(s, n) {

    return s.split("").map((el)=>{
        if (el == " "){
            return el;
        }
        const tmp = el.charCodeAt()
        return el.toUpperCase().charCodeAt()+n > 90 
            ? String.fromCharCode(tmp+n-26) 
            : String.fromCharCode(tmp+n)
    }).join('')

}
  • charCodeAt / fromCharCode 란?fromCharCode 는 아스키코드번호를 받아 문자열을 구성해주는 함수입니다.
  • charCodeAt 은 문자열중 하나를 선택하여 아스키코드 번호로 변환해주는 함수이며,