[코딩테스트] Lv.1 시저 암호

Keunyeong Lee·2022년 1월 14일
0

[코딩테스트]

목록 보기
1/11
post-thumbnail

☝🏽 문제

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

❗️ 제한 조건

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

🙋🏽‍♂️ 풀어보기!

function solution(s, n) {
    // 알파벳배열을 만든다.
    const arr = "abcdefghijklmnopqrstuvwxyz";
    // 첫번째 인자를 배열로 만든다.
    let answer = '';
    answer = s.split("");
    //들어온 첫번째 인자를 map을 통해 돌려준다.
    answer = answer.map((str) => {
      // 공백은 그냥 나가
      if (str === " ") {
        return " ";
      } else {
        // 대문자인 값은
        // 대문자 확인해서 소문자로 바꿔서 인덱스 찾고
        if (str === str.toUpperCase()) {
          str = str.toLowerCase();
          // 배열에서 인자로 들어온 값의 인덱스를 찾기
          const initialIndex = arr.indexOf(str);
          // 인덱스가 배열 마지막 인덱스일때
          if (initialIndex === arr.length-1) {
                str = arr[n-1].toUpperCase();
                return str;
          } else {
            let index = initialIndex + n;
            if( index >= 26 ){
                index = index - 26
                str = arr[index].toUpperCase();
                return str;
            } else {
                str = arr[index].toUpperCase();
                return str;
            }
          }
        } else { // 소문자인 값은
          // 배열에서 인자로 들어온 값의 인덱스를 찾기
          const initialIndex = arr.indexOf(str);
          // 인덱스가 배열 마지막 인덱스일때
          if (initialIndex === arr.length-1) {
            if(n >= 1){
                str = arr[n-1];
                return str;
            }
          } else {
            let index = initialIndex + n;
            if( index >= 26 ){
                index = index - 26
                str = arr[index];
                return str;
            } else {
                str = arr[index];
                return str;
            }
          }
        }
      }
    });
    
    answer = answer.join("");
    return answer
}

🤔 이슈!

  • 처음엔.. : 7.7점 ㅠ

  • 알파벳을 밀었을 때 끝을 돌아 다시 a 부터 시작해야한다는 걸 빼먹음! 밀어야 되는 수와 알파벳의 인덱스를 더했을때 총 알파벳 갯수보다 크면 총 알파벳 갯수 만큼 빼주는 로직 추가! : 42점..

  • 알파벳 총 갯수 26보다 클 뿐만 아니라 같은것도 빼줘야한다! : 100점

👍 다른사람 풀이 중 내가 생각하는 베스트!

  • 패터쓴 님 풀이!
function solution(s, n) {
    var chars = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXY                          "
    return s.split('').map(e => chars[chars.indexOf(e)+n]).join('');
}
  • 내가 한 방식과 거의 동일! 어차피 제한이 25이기 때문에 그냥 두번씩 적고 대문자도 구분할 필요 없이 그냥 두번씩 이어서 적어서 코드량 줄이기!

  • 코딩은 사람이 직접 입력하는것을 최소화 하는 것이 좋다고 생각한다. 아닌 부분도 있겠지만 코딩테스트 문제를 풀면서 미리 변수로 다 정해버리면 코딩테스트가 덜 되지 않을까?? 내 생각!

⚙️ 리펙토링!

  • 더 효율적이라기 보단! 직접 변수를 입력하지 않고 아스키코드를 활용해보고싶어서 해봄!
function solution(s, n) {
  let answer = "";
  answer = s
    .split("")
    .map((str) => {
      if (str === " ") {
        return " ";
      } else {
        const newStr =
          str === str.toUpperCase()
            ? str.charCodeAt(0) + n - "A".charCodeAt(0) >= 26
              ? String.fromCharCode(str.charCodeAt(0) + n - 26)
              : String.fromCharCode(str.charCodeAt(0) + n)
            : str.charCodeAt(0) + n - "a".charCodeAt(0) >= 26
            ? String.fromCharCode(str.charCodeAt(0) + n - 26)
            : String.fromCharCode(str.charCodeAt(0) + n);
        return newStr;
      }
    })
    .join("");

  return answer;
}
  • 프로그래머스 정답에 넣어서 확인 : 100점
profile
🏃🏽 동적인 개발자

0개의 댓글