230410_Algorithm

majungha·2023년 4월 27일
1

알고리즘

목록 보기
21/71

오늘의 알고리즘 👍

📝 1. 시저 암호

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

▷ 입출력 예

solution("AB", 1) // "BC"
solution("z", 1) // "a"
solution("a B z", 4) // "e F d"

▷ 내 풀이

function solution(s, n) {
  let arr = 'abcdefghijklmnopqrstuvwxyz';
  let ARR = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  let answer = '';

  for (let i = 0; i < s.length; i++) {
    s[i] === ' ' ? (answer += ' ') : 0;
    for (let j = 0; j < arr.length; j++) {
      s[i] === arr[j] ? (answer += arr[(j + n) % arr.length]) : 0;
      s[i] === ARR[j] ? (answer += ARR[(j + n) % arr.length]) : 0;
    }
  }

  return answer;
}

▷ 수업 풀이

const alphabet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

function solution(s, n) {
  let answer = '';
  for (let i = 0; i < s.length; i++) {
    // 공백일 경우
    if (s[i] === ' ') {
      answer += ' ';
    } else {
      let idx = alphabet.indexOf(s[i]);
      const word = idx > 25 ? alphabet.slice(26) : alphabet.slice(0, 26);

      idx = word.indexOf(s[i]) + n;

      if (idx >= 26) {
        idx -= 26;
      }
      answer += word[idx];
    }
  }
  return answer;
}

▷ 수업 풀이 2

const lower = 'abcdefghijklmnopqrstuvwxyz';
const upper = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';

function solution(s, n) {
  let answer = '';
  for (let i = 0; i < s.length; i++) {
    // 공백일 경우
    if (s[i] === ' ') {
      answer += ' ';
    } else {
      // 소문자인지를 먼저 검증한 후
      // 소문자가 맞다면,  소문자 리스트를 저장
      // 소문자가 아니라면, 대문자 리스트를 저장
      const word = lower.includes(s[i]) ? lower : upper;
      let idx = word.indexOf(s[i]) + n;

      if (idx > 25) {
        idx -= 26;
      }
      answer += word[idx];
    }
  }
  return answer;
}

▷ split, reduce 매서드 사용 풀이

const lower = 'abcdefghijklmnopqrstuvwxyz';
const upper = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';

function solution(s, n) {
  let answer = s.split('').reduce((acc, cur) => {
    const word = lower.includes(cur) ? lower : upper;
    let idx = word.indexOf(cur) + n;

    if (idx >= 26) {
      idx -= 26;
    }

    return acc + (cur === ' ' ? ' ' : word[idx]);
  }, '');
  return answer;
}

▷ 아스키 코드 사용 풀이

// a - z : 97 ~ 122 의 숫자를 나타낸다
// A - Z : 65 ~ 90 의 숫자를 나타낸다

function solution(s, n) {
  // charCodeAt : 주어진 문자의 아스키 코드(숫자)를 변환
  // String.fromCharCode : 아스키 코드(숫자)를 문자로 변환

  let answer = '';

  for (let i = 0; i < s.length; i++) {
    let idx = s[i].charCodeAt() + n;
    if (idx > 122 || (idx > 90 && idx - n < 97)) {
      idx -= 26;
    }
    answer += s[i] === ' ' ? ' ' : String.fromCharCode(idx);
  }
  return answer;
}

출처: 프로그래머스
출처: 코드캠프

profile
개발자 블로그 / 항상 겸손한 자세로 배우면서 성장하자 할 수 있다!

0개의 댓글