[프로그래머스]시저 암호

jaemin·2020년 11월 30일
0

프로그래머스

목록 보기
10/18
post-thumbnail

시저 암호

문제 설명

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

단, 공백은 아무리 밀어도 공백이다.
s는 알파벳 소문자, 대문자, 공백으로만 이루어져 있다.

풀이 설계

두 가지 풀이 방법이 생각났다.
알파벳 대문자로만 이루어진 배열과 소문자로만 이루어진 배열을 선언하고 그 안에서 순회하는 방법과 문자열을 아스키코드로 변경한 후 코드 번호를 n만큼 더한 후 문자열로 변환하는 방법이 있다.

손수 알파벳 배열을 만드는 방법은 출제자의 의도와 맞지 않을 것 같다고 판단하여 아스키 코드로 전환하는 방법으로 접근했다.

풀이 과정

처음엔 쉽게 생각했는데 의외로 따져줘야할 것이 많았다.
단순히 fromCharCode 메서드를 사용해서 더하면 끝나는 줄 알았는데 예외 사항이 발생했다.

function solution(s, n) {
  let answer = '';
  for (let i = 0; i < s.length; i++) {
      answer += String.fromCharCode(s[i].charCodeAt() + n);
    }
  return answer;
}

이렇게 작성했을 경우, Z에서 문제가 발생한다. Z에서 1을 더하면 다시 A로 돌아가야 하는데 [대괄호로 돌아간다. 마찬가지로 소문자z도 똑같이 처리해야 한다.

function solution(s, n) {
  let answer = '';
  for (let i = 0; i < s.length; i++) {
    let str = s[i].charCodeAt();
    if (str >= 65 && str <= 90) {
      if (str + n > 90) str -= 26;
      answer += String.fromCharCode(str + n);
    }
    if (str >= 97 && str <= 122) {
      if (str + n > 122) str -= 26;
      answer += String.fromCharCode(str + n);
    }
  }
  return answer;
}

str이란 변수를 만든 이유는 str을 만들지 않았다면 인수 s에 재할당이 되기 때문이다. s[i].charCodeAt() -= 26

여기서 끝이 아니라 조건에 있는 공백 처리도 해주어야 한다.

function solution(s, n) {
  let answer = '';
  for (let i = 0; i < s.length; i++) {
    let str = s[i].charCodeAt();
    if (str >= 65 && str <= 90) {
      if (str + n > 90) str -= 26;
      answer += String.fromCharCode(str + n);
    }
    if (str >= 97 && str <= 122) {
      if (str + n > 122) str -= 26;
      answer += String.fromCharCode(str + n);
    }
    if (str === 32) answer += String.fromCharCode(str);
  }
  return answer;
}

다른 사람의 풀이

개인적으로 재밌었던 풀이이다.

function caesar(s, n) {
    var result = "";
    // 함수를 완성하세요.
    var alphabetArray = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z",
                       "a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z",
                       "a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z",
                       "a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z",
                       "A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z",
                       "A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z",
                       "A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z",
                       "A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z",
                       " "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," ",
                       " "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," ",
                       " "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," ",
                       " "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," ",];

    var splitArray = s.split("");
  //indexOf 로 배열에서 인덱스를 알아낸 후 인덱스에 n을 더한다.

    for(var i = 0 ; i < splitArray.length ; i++)
  {
    var mn = alphabetArray.indexOf(splitArray[i]);
    splitArray[i] = alphabetArray[mn+n];

    result = result + "" + splitArray[i];
  }

  return result;
}
profile
프론트엔드 개발자가 되기 위해 공부 중입니다.

0개의 댓글