Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 아주작은습관의힘
- 알고리즘
- 전자계약솔루션
- 아이폰12
- 전자계약
- 옥소폴리틱스
- 자릿수더하기
- 아이폰
- 모두사인
- 독후감
- 모두의사인
- 온라인계약
- 모두싸인마케팅
- 모두싸인마케터
- 전자계약서비스
- 모두싸인
- map
- 마케팅
- 갤럭시노트20
- 전자계약시스템
- 블록체인
- 습관
- javascript
- 독서리뷰
- 자바스크립트
- 좋은습관
- 아이폰13
- 코딩테스트
- atomichabits
- 전자계약서
Archives
- Today
- Total
찰리의 이야기
Javascript 시저 암호 본문
반응형
Javascript 시저 암호
문제 : 어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 "AB"는 1만큼 밀면 "BC"가 되고, 3만큼 밀면 "DE"가 됩니다. "z"는 1만큼 밀면 "a"가 됩니다. 문자열 s와 거리 n을 입력받아 s를 n만큼 민 암호문을 만드는 함수, solution을 완성해 보세요.
제한 조건
- 공백은 아무리 밀어도 공백입니다.
- s는 알파벳 소문자, 대문자, 공백으로만 이루어져 있습니다.
- s의 길이는 8000이하입니다.
- n은 1 이상, 25이하인 자연수입니다.
입출력 예
s / n / result
"AB" | 1 | "BC" |
"z" | 1 | "a" |
"a B z" | 4 | "e F d" |
주어진 코드 ↓
function solution(s, n) {
var answer = '';
return answer;
}
우선 알파벳의 인덱스를 밀어내기 위해서는
인덱스를 가지는 알파벳 인덱스들을 가져야할 것 같습니다.
그리고 n 만큼 밀어내는 로직과,
대소문자를 판단해서 toLowerCase()나
toUpperCase()를 해주는 로직이 필요할 것 같습니다.
function solution(s, n) {
let alphabet = "abcdefghijklmnopqrstuvwxyz";
let answer = [];
function charCase(char, i){
if(s[i].match(/[A-Z]/g)){
return char.toUpperCase();
}else{
return char.toLowerCase();
}
}
for(let i=0; i<s.length; i++){
let newIndex = alphabet.indexOf(s[i].toLowerCase()) + n;
if(s[i] === " "){
answer.push(" ");
}else if(newIndex >= 26){
answer.push(charCase(alphabet[newIndex - 26], i));
}else{
answer.push(charCase(alphabet[newIndex], i));
}
}
return answer.join("");
}
대소문자를 판단하는 함수 charCase()를 따로 만들었습니다.
match()와 정규표현식을 이용해서
주어진 s가 대문자에 속하는지 소문자에 속하는지 판단해서
char에 해당하는 알파벳을 대소문자화 해주는 방식입니다.
여기까지가 제 풀이 방법이고,
다른 풀이법도 살펴보았습니다.
function solution(s, n) {
return s.split('').map((el)=>{
if(el === ' ') {
return ' ';
}
let ascii = el.charCodeAt();
return el.toUpperCase().charCodeAt() + n > 90 ? String.fromCharCode(ascii+n-26) : String.fromCharCode(ascii+n)
}).join('');
}
해당 문자열 s를 split("")으로 배열로 만든 다음,
해당 문자 하나하나를 charCodeAt()을 통해서 아스키코드 넘버로 바꾸어주었다.
아스키코드가 90번까지가 대문자 이기 때문에,
대문자인 경우 반대로 아스키코드를 문자로 변환해주는 fromCharCode()를 사용하면서
알파벳 숫자인 26개를 빼주는 식으로 다시 순환을 돌도록 구성했다.
디테일한 작업이야 비숫했지만,
대소문자 판단을 아스키코드와 charCodeAt()을 사용할 수 있다는걸 알게됐고,
반복문은 가급적 map을 이용하면 훨씬 코드가 간략해질 수 있을 것 같다.
오늘도 많이 배웠다.
Javascript 시저 암호
반응형
'찰리: 코딩 연습' 카테고리의 다른 글
Javascript 문자열 다루기 기본 (0) | 2021.09.21 |
---|---|
Javascript 수박수박수박수박수박수? (0) | 2021.09.18 |
Javascript 이상한 문자 만들기 (0) | 2021.09.15 |
Javascript 자릿수 더하기 (0) | 2021.09.14 |
Javacsript 자연수 뒤집어 배열로 만들기 (0) | 2021.09.14 |
Comments