알고리즘 -2021/04/17

sanghun Lee·2021년 4월 16일
0

알고리즘

목록 보기
23/52
post-thumbnail

문제 설명

어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 "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"

풀이

function solution(s,n){
  let answer = "";
  
  //들어온 문자열의 길이만큼 반복
  for(let i = 0; i < s.length; i ++){
    //각 문자열의 아스키코드를 담은 변수 charUni 선언
    let charUni = s[i].charCodeAt(0);
    
    //charUni가 소문자알파벳의 아스키코드내에 존재하는 경우
    if(charUni >= "a".charCodeAt(0) && charUni <= "z".charCodeAt(0)){
      //밀어줘야하는 n 만큼 아스키코드를 더한다.
        charUni = charUni + n;
      
      //만약 z를 넘어서는 아스키코드값이 생성된다면
      if(charUni > "z".charCodeAt(0)){
        //알파벳의 개수인 26개 만큼 빼줘서 한바퀴를 돈 것과 같은 인덱스를 만들어준다.
        charUni -= 26;
      }
      
     //charUni가 대문자알파벳의 아스키코드내에 존재하는 경우
    }else if(charUni >="A".charCodeAt(0) && charUni <= "Z".charCodeAt(0)){
      //밀어줘야하는 n 만큼 아스키코드를 더한다.
      charUni = charUni + n;
      
      //만약 Z를 넘어서는 아스키코드값이 생성된다면
      if(charUni > "Z".charCodeAt(0)){
        
        //알파벳의 개수인 26개 만큼 빼줘서 한바퀴를 돈 것과 같은 인덱스를 만들어준다.
        charUni -= 26;
      }
      
    }

    //fromCharCode메서드를 통해 다시 문자로 변환해주고 answer문자열에 붙여준다.
    answer +=  String.fromCharCode(charUni);
  }
  return answer
}

출근길에는 아스키코드를 써서 빨리 해결하면 되겠군!ㅋ 에서 조건문이 계속 뭔가 엇나가서 되지 않았다.

퇴근길에는 위 방식이 뭔가 애매하게 안되서 그렇다면,
소문자 알파벳을 다 넣은 배열을 하나 만들고 toUpperCase를 이용해 대문자 배열을 만들고
거기서 매칭 시킨 뒤에 Index를 찾고 거기서 +n을 하고 이게 length를 넘으면 length만큼 다시 빼면 되겠다 생각하며 퇴근길을 소모했다.

집에와서 생각해보니 이미 map과 유사하게 사용할 수 있는 아스키코드가 존재해서 그 범위만 잘 잡아주는 조건문만 작성하면 된다고 판단하게 되었다.

침착하게 조건을 하나하나 만들다 보니 잘 되게 되었다.

끝!


참고

profile
알고리즘 풀이를 담은 블로그입니다.

0개의 댓글