시저암호란 어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 말한다. 문자열 s와 거리 n을 입력받아 s를 n만큼 민 암호문을 만드는 함수를 완성하라.
- 제한조건
- 공백은 아무리 밀어도 공백
- s는 알파벳 소문자, 대문자, 공백으로만 이루어짐
- s의 길이는 8000이하, n은 1 이상, 25이하인 자연수
- Example
- "AB"는 1만큼 밀면 "BC", 3만큼 밀면 "DE"
- "z"는 1만큼 밀면 "a"
function solution(s, n) {
let answer = '';
const large = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
const small = 'abcdefghijklmnopqrstuvwxyz'
for(let i = 0; i < s.length; i++){
if(s[i] === ' ') { // 공백일때
answer += ' ';
} else { // 공백아닐때
if(s[i] === s[i].toUpperCase()) { // 대문자일때
let largeIndex = large.indexOf(s[i]);
let largeString = large[largeIndex + n];
if(largeIndex + n > 25) { // z → a로 갈 수 있는 조건
largeString = large[(largeIndex + n) - 26];
}
answer += largeString;
} else if (s[i] === s[i].toLowerCase()) { // 소문자일때
let smallIndex = small.indexOf(s[i]);
let smallString = small[smallIndex + n];
if(smallIndex + n > 25) { // z → a로 갈 수 있는 조건
smallString = small[(smallIndex + n) - 26];
}
answer += smallString;
}
}
}
return answer;
}
📍 풀이과정
- 조건에 맞는 대문자와 소문자를 각각 찾아 answer에 더해주기 위해, 대문자를 모아둔 변수 large와 소문자를 모아둔 변수 small을 선언한다.
- s의 자리를 0번째부터 순차적으로 돌며, 공백인지를 먼저 판단하고, 공백이 아니라면 대문자인지 소문자인지 판단한다.
- 대문자라면
변수 large
에서 같은 문자의 index를 찾아변수 largeIndex
로 선언largeIndex
에 n을 더한 자리의 문자를 answer에 더한다.- z → a로 돌 수 있도록 추가조건을 넣어준다. (
largeIndex
+ n 이 25보다 크면 26 빼주기)- 소문자도 위와 같은 방식으로 answer에 더해준다
function solution(s, n) {
let answer = '';
const lower = 'abcdefghijklmnopqrstuvwxyz';
const upper = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
for (let i = 0; i < s.length; i++) {
if (s[i] === ' ') {
answer += ' ';
} else {
if (lower.indexOf(s[i]) > -1) {
answer += lower[(lower.indexOf(s[i]) + n) % lower.length];
} else {
answer += upper[(upper.indexOf(s[i]) + n) % upper.length]
}
}
}
return answer;
}
- 위 풀이를 통해 내가 푼 것처럼 변수를 많이 선언할 필요가 없다는 것을 알 수 있었다.
- 나머지 연산자
%
를 활용해서 z에서 a로 돌아갈 수 있는 조건을 충족시킬 수 있다는 것을 알 수 있었다.
나머지 연산자%
를 활용해 문자열의 끝에서 다시 처음으로 돌 수 있는 방법을 배울 수 있었다.