본문 바로가기
알고리즘 문제/프로그래머스_Lv1 도장깨기

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

by 스코필 2023. 12. 22.

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/12926

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제 설명

문장의 각 알파벳을 일정한 거리(n)만큼 밀어서 다른 알파벳으로 바꾸는 문제이다.

제한사항

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

 

풀이

대문자 영어와 소문자 영어의 문자열을 만든 뒤,

공백 처리를 해주고, 변수의 대소문자를 구분한 다음

해당 변수의 인덱스에 n만큼 더하고 영어의 문자열 길이를 넘어가면 따로 처리해주었다.

 

✅ Code - 성공

function solution(s, n) {
    var answer = '';
    let upper = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    let lower = 'abcdefghijklmnopqrstuvwxyz'
        
    for (let i = 0; i < s.length; i++) {
        if (s[i] === ' ') {
            answer += ' ';
        } else {
            const upLow = upper.includes(s[i]) ? upper : lower;
            let idx = upLow.indexOf(s[i]) + n;
            if (idx >= upLow.length) {
                idx -= upLow.length;
            }
            
            answer += upLow[idx];            
        }
    }
    
    return answer;
}

 

✅ Code - 아스키코드 사용

function solution(s, n) {
    var answer = '';
    
    for (let i = 0; i < s.length; i ++) {
        let e_idx = s[i].charCodeAt();
        if (e_idx >= 65 && e_idx <= 90) {
            e_idx += n;
            if (e_idx > 90) {
                e_idx -= 26;
            }
        } else if (e_idx >= 97 && e_idx <= 122) {
            e_idx += n;
            if (e_idx > 122) {
                e_idx -= 26;
            }
        }

        answer += String.fromCharCode(e_idx);
        
    }
    
    return answer;
}
    
    return answer;
}

 

※ 참고

  • 문자를 아스키 번호 변환 => 문자.CharCodeAt()
console.log('A'.charCodeAt()) // 65
console.log('Z'.charCodeAt()) // 90
  • 아스키 코드를 문자로 변환 => String.fromCharCode(아스키 번호)
console.log(String.fromCharCode(65)) // 'A'
console.log(String.fromCharCode(90)) // 'Z'