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

재오·2023년 5월 28일
2

코딩테스트

목록 보기
31/46
post-thumbnail

🗒️ 문제

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

⚠ 제한사항

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

📝 문제 해설

1시간을 이 문제에 투자했었지만 성과를 얻지 못해서 넘겼던 문제였다. 70%대 정답률 문제를 아직도 풀지 못한다는 점이 납득이 안가서 오기가 생겨서 풀어보려 했다. 하지만 20분도 되지 않아서 문제를 풀 수 있었다.(그 때 왜 못풀었지...?)

우선 처음 드는 생각은 문자열을 배열로 바꿔서 인덱스 값을 이용해야겠다! 였다. 그래서 알파벳 26개를 담고 있는 배열을 만들어주었다. 여기서 잠깐 들었던 생각은 소문자와 대문자를 구분해서 배열을 만들어야 하나? 였다. 하지만 반복문에서 원소 값이 대문자면 소문자로 바꿔서 배열에서 연산과정을 거친 후 다시 대문자로 바꿔주면 된다고 생각이 들었다. 반복문 안에서는 공백이 있는 겨우를 먼저 처리해주고 -> 다음으로 대문자 케이스 -> 나머지로 소문자 케이스로 나눠서 계산하였다.

하지만 내가 놓친 포인트가 하나 있었다. 배열은 25번째 index(z)가 끝이었는데 여기서 한칸을 이동하면 다시 배열 처음으로 이동해야 했다. 그때 들었던 생각은 k+n이 아닌 k+n을 배열의 개수로 나눠서 나머지 값을 인덱스로 주는 것이었다. 그렇게 문제를 해결할 수 있었다.

💡 필요 문법

split()

문자열을 배열로 반환해준다.

indexOf()

배열에서 원하는 원소의 index값을 반환해준다.

toLowerCase() / toUpperCase()

문자열을 소문자, 대문자로 각각 반환해주는 역할을 한다.

💻 코드

function solution(s, n) {
    let alpha = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'];
    s = s.split(''); // 문자열을 배열로 바꿔준다 (index값을 이용할 것이기 때문)
    
    // 배열 원소 하나하나를 n만큼 인덱스 이동하여 바꿔줄 것이다
    for(let i=0; i<s.length; i++){
        // 빈칸은 무시한다
        if(s[i] === " ") continue;
        
        // 대문자인 경우에는 소문자로 바꿔준 후 다시 대문자로 바꿔준다
        else if(s[i] === s[i].toUpperCase()){
            let k = alpha.indexOf(s[i].toLowerCase());
            s[i] = alpha[(k+n)%26].toUpperCase();
        }
        // 소문자인 경우에는 index 값만 찾아서 이동시켜 준다
        else{
            let k = alpha.indexOf(s[i]);
            s[i] = alpha[(k+n)%26];
        }
    }
    return s.join('');
}
profile
블로그 이전했습니다

0개의 댓글