728x90

문제


https://programmers.co.kr/learn/courses/30/lessons/12926?language=javascript 

 

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

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

programmers.co.kr

 

코드


function solution(s, n) {
    return s.split("").map((i) => {
        if (i === " ") return " "; //공백은 그냥 공백 출력
        let unicode = i.charCodeAt(); //s의 각 문자의 유니코드
        return i.toUpperCase().charCodeAt() + n > 90 ? String.fromCharCode(64 + (n - (90 - unicode))) : String.fromCharCode(unicode + n);
    }).join("");
}

 

후기


  • 문제 이해 : 문자열 s의 각 문자 하나씩을 다 +n만큼 한 문자열로 반환하기 (단, z나 Z의 경우에는 a, A로 반환)
  • 보자마자 아스키코드를 이용해야겠다는 생각이 들었고, 아스키코드 표와 관련함수를 먼저 찾아봤다. 아스키코드를 구하는 함수는 대표적으로 두 가지가 있었다.
  • charCodeAt() : 문자열을 아스키코드 숫자로 바꾸어준다
  • fromCharCode() : 아스키코드 숫자를 문자열로 바꾸어준다
  • 아스키코드 표 참고한 블로그 : https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=diceworld&logNo=220175224345 
  • 표를 보고 먼저 A,Z,a,z 의 아스키코드 번호를 파악했다 (Z=90, A=65, z=122, a=97)
  • Level1 문제치곤 로직을 짜는게 조금 까다로웠다. 처음엔 쉽다고 생각하여 문자열 s의 각 문자들에 +n 만큼 한 아스키코드 번호를 구하고 해당 번호가 90(Z), 122(z)를 각각 넘으면 A,a로 돌아가 다시 계산하겠단 식으로 로직을 짰지만 90을 넘어가면 소문자 a-z 문자들에도 걸쳐지기 때문에 상당히 복잡해졌다
  • 그래서 우선 각 문자들을 대문자화해서 아스키코드 번호가 Z를 넘어간다면 (64 + (n - (90 - unicode))) 의 로직으로 해당 아스키코드의 문자를 반환하게 풀이했다. 왜 저런 로직을 쓰는지 이해하기 위해서는 아스키코드표를 보며 직접 이해해보는 것이 좋다고 생각한다! 이걸 이해하는 데 은근 시간을 쏟은 문제였다

+ Recent posts