Algorithm - 시저 암호

박태환·2021년 10월 31일
0

Algorithm

목록 보기
15/20
post-thumbnail

문제 설명

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

제한사항

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

입출력 예

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

나의 풀이

function solution(s, n) {
  var answer = "";
  const sArr = s.split(""); // 들어온 문자 배열로 쪼개기
  const large = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  const small = "abcdefghijklmnopqrstuvwxyz";
  const largeArr = large.split("");
  const smallArr = small.split("");

  sArr.map((e) => {
    if (largeArr.indexOf(e) !== -1) {
      answer += largeArr[(largeArr.indexOf(e) + n) % 26];
      //입력받은 문자가 대문자인지 파악한 후 맞다면 n만큼 옮겨서 더해주기
    }
    if (smallArr.indexOf(e) !== -1) {
      answer += smallArr[(smallArr.indexOf(e) + n) % 26];
      //입력받은 문자가 소문자인지 파악한 후 맞다면 n만큼 옮겨서 더해주기
    }
    if (e === " ") {
      answer += " ";
    }
  });

  return answer;
}

풀이 설명

약간의 무식한 방법처럼 보이긴 하지만 일단 풀어서 설명을 해보자면..
대문자와 소문자 알파벳 전부를 배열로 만들고
map을 이용해 n만큼 밀어주었다.
다만 z에서 다시 처음으로 돌아와야 하기 때문에 저번 알고리즘 문제에 나왔던 것 처럼 알파벳 개수인 26으로 나눠준 나머지로 계산!
map 안에서는 먼저 들어온 문자가 대문자인지 소문자인지 파악하고 계속해서 answer에 더해주는 방법을 선택했다.
마지막 예제처럼 공백이 있는 경우는 공백까지 더해주어야 하기 때문에 마지막 if문도 추가!

다른 사람의 풀이

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

    for(var i =0; i <s.length; i++){
        var text = s[i];
        if(text == ' ') {
            answer += ' '; 
            continue;
        }
        var textArr = upper.includes(text) ? upper : lower;
        var index = textArr.indexOf(text)+n;
        if(index >= textArr.length) index -= textArr.length;
        answer += textArr[index];
    }
    return answer;
}

다른 사람의 풀이 설명

비슷한 느낌이지만 풀이 방법이 훨씬 깔끔했다.
삼항연산자로 대소문자 구문 한 줄로 깔끔하게 끝내고..
n개씩 밀리는 것도 index로 깔끔하게 한 줄로 끝내고
z같은 예외도 아주 깔끔하게 정리가 되어있다..!

느낀 점

많이 풀면 풀 수록 는다는 느낌보다는 아직 한참 멀었다는 생각이 많이 드는 문제였다..!

profile
mekemeke

0개의 댓글