5월30일 알고리즘(시저암호)

이정민·2022년 5월 29일
0

알고리즘

목록 보기
13/23

문제 설명

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

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

입출력
s ,nresult
"AB" 1"BC"
"z" 1"a"
"a B z" 4"e F d"

나의 풀이

function solution(s, n) {
    const upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    const lower = "abcdefghijklmnopqrstuvwxyz";
    let answer= '';

    for(let i =0; i <s.length; i++){
        if(s[i] == ' ') {
            answer += ' '; 
            continue;
        }
        let alpha = upper.includes(s[i]) ? upper : lower;
        let index = alpha.indexOf(s[i])+n;
        if(index >= upper.length) {
            index -= upper.length
        }
        answer += alpha[index];
    }
    return answer;
}

처음에는 전부 배열에 넣고 for문을 돌아서 답을 낸 후 다시 string화 하는 것으로 생각했는데 대체 왜 그렇게 시작했는지 알 수 가 없다... 졸려서 제대로 머리가 안돌아간거같긴한데.. 굳이 왜 string을 array에 넣고 그걸 다시 string화 하려고 했는지...

여튼..
그래서 일단 대소문자를 구별하기 때문에 대소문자를 모두 가지고 있는 string을 선언하고
s의 길이만큼 for문을 돌아 만약 문자가 빈칸일 경우 선언된 answer에 빈값을 더해준다.

입력으로 들어온 s가 대문자 스트링(upper)에 있다면 대문자를 없다면 소문자를 가지고 오게 삼항연산자를 작성하였다.
그리고 인덱스의 경우는 해당문자의 알파벳 순서를 indexOf()를 통해 따온뒤 n을 더해주었다.

이 후 만약 index가 알파벳의 수보다 클 때(예를 들어 z의 경우 어떤 숫자가 오더라도 기존 알파벳의 수보다 큰 수가 인덱스가 되게 됨 ) index는 알파벳의 수만큼 빼준다.

이 후 선언해두었던 빈배열에 값을 삽입하여 리턴한다.

어렵지 않은 문제였는데도 불구하고 문제의 방향설정을 잘못해서 한참을 헤맸다..

0개의 댓글