어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 "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" |
const solution = (s, n) => {
const upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
const lower = "abcdefghijklmnopqrstuvwxyz";
let answer= '';
for(let i =0; i <s.length; i++){
let text = s[i];
if(text == ' ') {
answer += ' ';
continue;
}
let textArr = upper.includes(text) ? upper : lower;
let index = textArr.indexOf(text) + n;
if(index >= textArr.length) index -= textArr.length;
answer += textArr[index];
}
return answer;
}
/*
내가 처음 작성한 코드이다.
1. 알파벳의 소문자 대문자를 string으로 upper, lower 변수에 초기값으로 작성해주었다.
2. answer 변수에는 최종 리턴값을 담을 예정이다. 빈 string으로 초기값을 작성했다.
3. for문을 통해서 i를 0부터 s의 길이만큼 1씩 증가 시켜주었다.
4. for 루프가 돌때마다 test 변수에는 s[i]를 초기값으로 설정해준다.
5. 이때 text에 빈 string이 들어온다면 answer에 빈 string을 추가하도록 해주었다.
6. textArr 변수에는 includes를 통해서 현재 text가 대문자인지 확인하고 대문자이면 upper를
소문자이면 lower를 저장하도록 만들었다.
7. index 변수에 indexOf를 통해 해당 text의 인덱스위치를 찾아서 n개만큼 더해준 값을 저장한다.
8. index가 저장한 upper변수나 lower변수의 길이보다 길경우(알파벳26개가 다 돌고), index의 값은
26개를 빼도록 해준다.
9. answer변수에 textArr[index]를 해주어 n만큼 이동시킨 후, 추가해준다.
10. for 루프가 종료된 후 answer를 반환해준다.
*/
const solution = (s, n) => {
const lower = ['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'];
const upper = ['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'];
return s.split(' ').map((word) => word.split('').map((char) => {
if (lower.indexOf(char) > -1) return lower[(lower.indexOf(char) + n) % lower.length]
else if (upper.indexOf(char) > -1) return upper[(upper.indexOf(char) + n) % upper.length]
}).join('')).join(' ')
}
/*
다른 방법으로도 작성해보았다. 이번엔 map을 사용하기 위해서 lower, upper를 배열로 만들어 주었다.
1. lower 배열은 소문자 알파벳을, upper 배열은 대문자 알파벳을 담아준다.
2. split을 통해서 입력된 문자열 s를 공백을 기준으로 단어별로 분할한다. 그리고 각 단어를 다시 문자별로 분할한다.
3. 각 문자에 대하여, 만약 해당 문자가 lower 배열에 있으면, 해당 문자의 인덱스를 찾고 n만큼 이동시킨 후,
배열 길이로 나눈 나머지를 새 인덱스로 사용한다. 대문자의 경우 upper 배열에 대해 동일한 연산을 수행한다.
4. 변환된 문자들을 다시 단어로 조합한 후, 이 단어들을 공백을 이용해 문장으로 조합하여 최종적으로 반환한다.
*/