*시저 암호(카이사르 암호)란 암호화하고자 하는 내용을 알파벳별로 일정한 거리만큼 밀어서 다른 알파벳으로 치환하는 암호화 방식이다.
#나의 풀이
function solution(s, n) {
let answer = '';
for (let i = 0; i < s.length; i++){
if(s[i] === " "){
answer += " ";
}
else{
let ascii = s.charCodeAt(i);
let moveNum = ascii + n;
if(ascii >= 65 && ascii <= 90){
moveNum > 90 ? answer += String.fromCharCode(moveNum - 26) : answer += String.fromCharCode(moveNum)
}
else{
moveNum > 122 ? answer += String.fromCharCode(moveNum - 26) : answer += String.fromCharCode(moveNum)
}
}
}
return answer;
}
*위의 코드를 내용은 같지만 조금 간결하게 만들어 보았다.
function solution(s, n) {
let answer = '';
for (let i = 0; i < s.length; i++){
if(s[i] === " "){
answer += " ";
continue;
}
let ascii = s.charCodeAt(i);
let moveNum = ascii + n;
ascii > 90 ? answer += String.fromCharCode((moveNum - 97) % 26 + 97) : answer += String.fromCharCode((moveNum - 65) % 26 + 65)
}
return answer;
}
2021/01/11 - [개발/Javascript] - charCodeAt, fromCharCode
#다른 방법1(아스키 코드를 활용하지 않고)
function solution(s, n) {
var upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
var lower = "abcdefghijklmnopqrstuvwxyz";
var answer= '';
for(var i =0; i <s.length; i++){
var text = s[i];
if(text == ' ') {
answer += ' ';
continue;
}
var textArr = upper.includes(text) ? upper : lower;
var index = textArr.indexOf(text)+n;
if(index >= textArr.length) index -= textArr.length;
answer += textArr[index];
}
return answer;
}
#다른 방법2(이렇게 코드를 짜는 날이 올까)
function caesar(s, n) {
var result = s.replace(/[a-z]/ig, c => [ c = c.charCodeAt(0), String.fromCharCode((c & 96) + (c % 32 + n - 1) % 26 + 1) ][1]);
return result;
}
프로그래머스에서 누군가 댓글로 적은 코드의 설명을 보며 이해했다.
2진법으로 대문자의 코드들은 1000001~1011010, 소문자는 1100001~1111010라서 앞에 2자리를 빼고는 같습니다.
즉, 앞의 2자리로 대소문자를, 나머지 5자리로 알파벳을 구분합니다. 따라서 '(c & 96(1100000))'으로 앞의 2자리만 가져와 먼저 대소문자 구분부를 빼놓습니다.
뒤에 남은 5자리의 수(00001~11010)를 가져오기 위해 'c % 32(100000)'를 합니다. a가 1부터 시작하니 나머지 계산을 위해 '- 1'을 해서 초기점을 0으로(00000~11001) 잡아줍니다. 그럼 0~25의 숫자 중 하나가 나오고 여기서 n만큼 더해준 뒤 26으로 나머지 계산을 하고,
다시 아까 빼 준 1을 다시 더한 것입니다.
'코딩테스트 > Javascript' 카테고리의 다른 글
이상한 문자 만들기 (0) | 2021.01.18 |
---|---|
약수의 합 (0) | 2021.01.13 |
문자열을 정수로 바꾸기 (0) | 2021.01.11 |
수박수박수박수박수박수? (0) | 2021.01.11 |
서울에서 김서방 찾기 (0) | 2021.01.09 |