카테고리 없음

[프로그래머스] 시저 암호 - 자바스크립트 0606

codevil 2022. 6. 6. 03:41

문제 설명

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

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

https://programmers.co.kr/learn/courses/30/lessons/12926

 

코딩테스트 연습 - 시저 암호

어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 "AB"는 1만큼 밀면 "BC"가 되고, 3만큼 밀면 "DE"가 됩니다. "z"는 1만큼 밀

programmers.co.kr

문제 풀이를 하기 위해서 필요한 것은

charCodeAt(), String.fromCharCode() 이렇게 두가지가 필요하다. 아 물론, Array에 a, b, c, d, e...을 넣는 것으로 인덱스를 이용하여 계산하는 풀이도 가능하지만, 그보다는 charCodeAt을 이용하여 풀이를 하는것이 가독성이 더 좋기 때문에 charCodeAt을 사용하였다.

우선 charCodeAt을 사용하기에 앞서, charCodeAt을 콘솔로그를 이용하여 a와 z를 소문자와 대문자로 변환하여 charCodeAt을 구한다.

위에서 구한 charCodeAt을 이용하여 소문자구간, 대문자구간의 charCodeAt의 숫자 구간이 몇 인지를 알 수 있다.

문제에서 주어진 s를 for 문으로 루프시킨다.

    for(let i=0;i<s.length;i++){
        let charCode =" "
        let char =s[i].charCodeAt()
    }

char을 이용하여, s[i]의 코드 번호를 저장하고, charCode를 선언하고 빈칸으로 비워둔다. 

위에서 구해둔 charCode를 이용하여 소문자와 대문자를 구분하여 범위에 맞게 if문을 구성한다.

    for(let i=0;i<s.length;i++){
        let charCode =" "
        let char =s[i].charCodeAt()
        if(char>=65&&char<=90){
        
        }else if(char>=97&&char<=122){

        }
    }

이때 주의 사항이, z를 넘어가는 숫자가 나타나면 a부터 시작해야하기 때문에 -26을 빼준다. 만일 주어진 n이 25보다 컸다면 문제 자체를 array로 구성하는 것이 훨씬 편했을꺼같다.

    for(let i=0;i<s.length;i++){
        let charCode =" "
        let char =s[i].charCodeAt()
        if(char>=65&&char<=90&&char+n>90){

        }else if(char>=97&&char<=122&&char+n>122){

        }else {

        }

    }

각 범위에 맞게 charCode를 바꿔준다

    for(let i=0;i<s.length;i++){
        let charCode =" "
        let char =s[i].charCodeAt()
        if(char>=65&&char<=90&&char+n>90){
                charCode = char+n-26
        }else if(char>=97&&char<=122&&char+n>122){
                charCode = char+n-26
        }else {charCode = char+n}
        
    }

그리고 s[i]를 answer에 한글자씩 붙여주는데 주의할 것은, s[i]가 " "인 경우에는 charCode로 계산했을때 빈칸이 나오지 않기 때문에 조건을 넣어서 answer을 붙이도록한다. 

function solution(s, n) {
    let answer =""
    for(let i=0;i<s.length;i++){
        let charCode =" "
        let char =s[i].charCodeAt()
        if(char>=65&&char<=90&&char+n>90){
                charCode = char+n-26
        }else if(char>=97&&char<=122&&char+n>122){
                charCode = char+n-26
        }else {charCode = char+n}
        answer+=s[i]!==" "?String.fromCharCode(charCode) : " "
    }
    return answer
}

 

charCodeAt과, fromCharCode를 사용하는 방법과 if문을 잘 사용할 수 있었다면 간단하게 풀 수 있는 문제였다.

(라고하지만 이전에 이미 문제풀이를 자주실패했다가 오늘 갑자기 풀이가됬다)