[programmers] Lv.1 시저암호

suwoncityboyyy·2023년 3월 9일
0
post-thumbnail

문제 설명

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

제한 조건

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

입출력 예

snresult
"AB"1"BC"
"z"1"a"
"a B z"4"e F d"

문제풀이

풀기 전 해야할 것
대소문자 포함 A~z 까지는 ascci 코드로보면 65부터 122까지다. 하지만
그 사이에 특수문자도 포함돼있다는걸 알아야 한다. 그럼 각 반복되는 문자마다 조건문을 걸어서 필터링을 해줘야한다.
시도
for문으로 각 문자를 아스키코드번호로 변환시킬 수 있는 charCodeAt 메서드를 사용한다.
그리고 대문자일때 , 소문자일때를 제외한 나머지는 필터링 될 수 있게 조건문을 달아준다.
하지만 테스트1,2는 되지만 3은 특수문자가 출력되는 상황.

function solution(s, n) {
  let result = "";
  for (let i = 0; i < s.length; i++) {
    let str = s.charCodeAt(i);
    if (str <= 90) {
      str += n;
      if (str > 90) str -= 26;
    } else {
      str += n;

      if (str > 122) str -= 26;
    }
    result += String.fromCharCode(str);
  }

  return result;
}

해결
공백도 아스키코드로 변환이 되고 n만큼 더해지기에 특수문자가 나온다.
if else문을 하나 더 걸어준 후 공백일때만 +를 해줘서 공백전용 문자열을 만들어주면 된다. (Ascci는 +를 통해서도 나타낼 수 있다고 한다.)

function solution(s, n) {
  let result = "";
  for (let i = 0; i < s.length; i++) {
    if (s[i] === " ") {
      result += " ";
    } else {
      let str = s.charCodeAt(i);
      if (str <= 90) {
        str += n;
        if (str > 90) str -= 26;
      } else {
        str += n;

        if (str > 122) str -= 26;
      }
      result += String.fromCharCode(str);
    }
  }
  return result;
}
profile
주니어 개발자 기술노트

0개의 댓글