[프로그래머스] Lv.1 시저 암호 (JavaScript)

혜린·2022년 1월 26일
0
post-thumbnail

🔐 문제

시저암호란 어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 말한다. 문자열 s와 거리 n을 입력받아 s를 n만큼 민 암호문을 만드는 함수를 완성하라.

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

  • Example
    • "AB"는 1만큼 밀면 "BC", 3만큼 밀면 "DE"
    • "z"는 1만큼 밀면 "a"

🔑 풀이

function solution(s, n) {
    let answer = '';
    const large = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    const small = 'abcdefghijklmnopqrstuvwxyz'
    
    for(let i = 0; i < s.length; i++){
      if(s[i] === ' ') { // 공백일때
          answer += ' ';
      } else {  // 공백아닐때
          if(s[i] === s[i].toUpperCase()) {  // 대문자일때
              let largeIndex = large.indexOf(s[i]);
              let largeString = large[largeIndex + n];
              if(largeIndex + n > 25) {  // z → a로 갈 수 있는 조건 
                  largeString = large[(largeIndex + n) - 26];
              }
              answer += largeString;
          } else if (s[i] === s[i].toLowerCase()) {  // 소문자일때
              let smallIndex = small.indexOf(s[i]);
              let smallString = small[smallIndex + n];
              if(smallIndex + n > 25) {  // z → a로 갈 수 있는 조건 
                  smallString = small[(smallIndex + n) - 26];
              }
              answer += smallString;
          }
      }  
    } 
    return answer;
}

📍 풀이과정

  1. 조건에 맞는 대문자와 소문자를 각각 찾아 answer에 더해주기 위해, 대문자를 모아둔 변수 large와 소문자를 모아둔 변수 small을 선언한다.
  2. s의 자리를 0번째부터 순차적으로 돌며, 공백인지를 먼저 판단하고, 공백이 아니라면 대문자인지 소문자인지 판단한다.
  3. 대문자라면 변수 large에서 같은 문자의 index를 찾아 변수 largeIndex로 선언
  4. largeIndex에 n을 더한 자리의 문자를 answer에 더한다.
  5. z → a로 돌 수 있도록 추가조건을 넣어준다. (largeIndex + n 이 25보다 크면 26 빼주기)
  6. 소문자도 위와 같은 방식으로 answer에 더해준다

🔑 다른풀이

function solution(s, n) {
    let answer = '';
    const lower = 'abcdefghijklmnopqrstuvwxyz';
    const upper = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    
    for (let i = 0; i < s.length; i++) {
        if (s[i] === ' ') { 
            answer += ' ';
        } else {            
            if (lower.indexOf(s[i]) > -1) { 
                answer += lower[(lower.indexOf(s[i]) + n) % lower.length];
            } else {                        
                answer += upper[(upper.indexOf(s[i]) + n) % upper.length]
            }
        }
        
    }
    return answer;
}
  • 위 풀이를 통해 내가 푼 것처럼 변수를 많이 선언할 필요가 없다는 것을 알 수 있었다.
  • 나머지 연산자% 를 활용해서 z에서 a로 돌아갈 수 있는 조건을 충족시킬 수 있다는 것을 알 수 있었다.

💡 배운점

나머지 연산자%를 활용해 문자열의 끝에서 다시 처음으로 돌 수 있는 방법을 배울 수 있었다.

profile
FE Developer

0개의 댓글