Coding test

[프로그래머스] 시저 암호 (Level 1)

Jiwoo 2022. 4. 14. 16:34

문제

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

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

나의 풀이

 

function solution(s, n) {

    let arr = [];

    for(let i = 0; i < s.length; i++) {

        let unicode = s.charCodeAt(i) + n;

        if ( (unicode > 64 || unicode < 91) || (unicode > 96 || unicode < 123)) {

        //    arr.push(unicode -> str)
            arr.push(String.fromCharCode(unicode));

        } else if ( (unicode > 90 || unicode < 97) || (unicode > 122 || unicode < 148)) {
        //    arr.push(unicode-26 -> str)
            arr.push(String.fromCharCode(unicode-26));

        } 
        else arr.push(" ")
    }

    // return arr -> str
    return arr.join("");

}

 
map과 삼항연산자를 사용할까 하다가 아직은 익숙치 않은 것 같아 풀어서 썼으나 어째 더 복잡해졌다.
예외사항을 조건부로 들었어야 하는데, 생각이 짧았다.
결과적으로 에러가 떴고, 비효율적인 것 같아 전면 수정했다.

 

정답 풀이

1대 1 변환이 필요한 문제는 map으로 거의 해결 가능하다.
 

function solution(s, n) {

  return s
    .split("")
    .map(e => 
        e === " "
        ? e
        : (e.charCodeAt() + n > 90 && e.charCodeAt() <= 90) || e.charCodeAt() + n > 122
        ? String.fromCharCode(e.charCodeAt() + n - 26)
        : String.fromCharCode(e.charCodeAt() + n)
    )
    .join("");
}

 
유니코드 A = 65 / Z = 90 / a = 97 / z = 122
 

  1. 조건 설정 - 경우의 수가 적은 예외상황을 먼저 파악!
     
    • 공백일 때 => 공백 반환
       
    • unicode <= 90 && unicode + n > 90 or unicode + n > 122
      (소문자이고, n으로 밀었을 때 z를 넘어가는 수 or 대문자이고 밀었을 때 122가 넘는 경우)
      => (unicode + n) - 26 한 수를 문자로 바꿔준다
       
  2. map 안에 화살표 함수 & 삼항 연산자를 사용해서 코드 작성
     
    화살표 함수는 알아서 반환하기 때문에 return을 쓸 필요가 없다
     

참고

제로초 블로그