
프로그래머스 연습 문제 lv1 시저 암호
문제 설명
어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 "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' |
정말 단순한 문제인데 푸는데 시간을 좀 투자한 문제이다. 문자열을 다루는 데에 아직 익숙지 않아서이다.
1) 우선 대문자와 소문자를 구분하여 다루기 위해 변수에 대문자열과 소문자열을 할당해 주었다.
const Upper = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
const Lower = 'abcdefghijklmnopqrstuvwxyz';
2) 그다음 문자열 s에 있는 각 요소가 띄어쓰기인지, 대문자인지, 소문자인지 구분하는 if문을 작성하고, if문 안에 시저 규칙을 적용하여 답에 더해주는 코드를 적었다.
for (let i = 0; i < s.length; i++) {
if (Upper.includes(s[i])) {
answer += Upper[(Upper.indexOf(s[i]) + n) % 26];
} else if (Lower.includes(s[i])) {
answer += Lower[(Lower.indexOf(s[i]) + n) % 26];
} else if (s[i] == " ") {
answer += ' ';
}
}
위의 코드는 세 차례 정도 수정된 코드인데, 처음엔 s[i] + n이 26보다 클 경우를 생각 못해서 틀렸고, 그다음은 s[i] + n이 26보다 클 때와 작을 때로 케이스를 나누어 식을 만들어 주었다.(26보다 크면 - 26 _ 이건 성공) 그러고 나서 코드를 더 깔끔하게 정리하려고 봤더니 굳이 26을 기준으로 두 가지 케이스로 나눌 필요 없었다. % 26으로 나머지 처리해주면 두 케이스로 나눴을 때와 같아지기 때문이다.
마무리.
function solution(s, n) {
var answer = '';
const Upper = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
const Lower = 'abcdefghijklmnopqrstuvwxyz';
for (let i = 0; i < s.length; i++) {
if (Upper.includes(s[i])) {
answer += Upper[(Upper.indexOf(s[i]) + n) % 26];
} else if (Lower.includes(s[i])) {
answer += Lower[(Lower.indexOf(s[i]) + n) % 26];
} else if (s[i] == " ") {
answer += ' ';
}
}
return answer;
}
'[프로그래머스]' 카테고리의 다른 글
[js] 프로그래머스 - 이진 변환 반복하기 (0) | 2022.09.08 |
---|---|
[js] 프로그래머스 - 로또의 최고 순위와 최저 순위 (0) | 2022.09.08 |
[js] 프로그래머스 - 소수 찾기 (0) | 2022.08.31 |
[js] 프로그래머스 - 성격 유형 검사하기 (0) | 2022.08.26 |
댓글