알고리즘문제

시저 암호 - 프로그래머스

단점이없어지고싶은개발자 2021. 9. 30. 22:29
반응형

시저암호 문제

제한 조건은 문자열 s에 n만큼 이동한 알파벳이 나오게 한다. 단, z의 경우 그 다음 다시 a로 돌아가야 된다.

문제를 본 순간 아스키 코드가 떠올랐다. 

 

https://shaeod.tistory.com/228

 

ASCII Table - 아스키 코드표

(아스키코드를 알면 C/C++이나 Java 등으로 문자열 함수를 다루거나 파일 함수를 다룰때 도움이 됩니다.) 컴퓨터는 0과 1 숫자 밖에 모르기 때문에 문자도 숫자로 기억합니다. 이때, 어떤 숫자와 어

shaeod.tistory.com

아스키코드는 알파벳에 숫자는 

대문자 : 65 ~ 90

소문자 : 97 ~ 122 

 

그래서 문자열을 아스키코드로 변형 시켜준 뒤, + n을 해주고, 다시 문자열로 바꿔주면 되지 않을까라 생각했다. 그런데 조건을 어떻게 주어야할까에서 막혔었다.

 

function solution (s, n) {
return s.split("").map((el) =< {
	//문자열 하나하나 봐야하기 때문에 배열로 만들어 주었다.
	if(el === " ") {
    //문자열 중에 빈 칸이 있다면 그 빈칸은 그대로 돌려준다.
    return el;
    //문자열이 z 혹은 Z라면 + n을 할 시 a로 넘어가게 해줘야된다.
	})
}
if(String.fromCharCode(el.charCodeAt() + n) > 90)...
// Z는 90이다. 90을 넘긴다면 a가 97이기 때문에 소문자들도 다 잡히게 된다.

//그런데 착각하고 있었던 부분이 조건식의 문자열을 바꿔주는 메서드를 사용하면 그것이 
//결과로도 이어지는 줄 알고 있었다
//무슨 뜻이냐면 만약 문자열을 대문자로 다 바꿔주는 el.toUpperCase()를 해준다면 
//el이 바뀌는 줄 알았지만 조건식을 나오면 el은 아무 영향도 없었다.

그래서 if(el.toUpperCase().charCodeAt() + n > 90)
//문자열을 대문자로 바꿔주고 + n 을 해줬을 때, 아스키코드 Z에 해당하는 90을 넘긴다면
String.fromCharCode(el.charCodeAt() + n - 26);
//fromCharCode메서드는 아스키코드를 숫자로 바꿔준다.
//만약 n이 1이라면 91이 된다. 그리고 -26은 알파벳 총 숫자다. 빼주면 65 = A가 된다.
else {
String.fromCode(el.charCodeAt() + n)
//아닐 시에는 +n만 해주고 돌려준다.
}

조건 부분에서 많은 시간을 빼앗기고 빙빙 돌았던 문제다. toLowerCase()를 해주고, 122로 변경해줘도 답은 동일 하게 나온다.

 

조건 부분을 생각하는 것 그리고 그 부분을 따라가다 보면 답이 나오는데, 아직도 머리속에서 빙빙 돌 때가 많다. 많이 보고, 많이 검색하고, 많이 풀자.

 

function solution(s, n) {
    return s.split("").map((el) => {
        if(el === " ") {
            return el;
        }
        return el.toLowerCase().charCodeAt() + n > 122
        ? String.fromCharCode(el.charCodeAt() + n - 26)
        : String.fromCharCode(el.charCodeAt() + n)
    }).join("");
}
반응형