반응형
문제:
어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다.
예를 들어 "AB"는 1만큼 밀면 "BC"가 되고, 3만큼 밀면 "DE"가 됩니다.
"z"는 1만큼 밀면 "a"가 됩니다.
문자열 s와 거리 n을 입력받아 s를 n만큼 민 암호문을 만드는 함수, solution을 완성해 보세요.
문제 풀어보기: https://school.programmers.co.kr/learn/courses/30/lessons/12926
풀이보기
더보기
function solution(s, n) {
return [...s].map((char) => {
if(char === ' ') return char;
let isUpper = char >= 'A' && char <= 'Z';
let base = isUpper ? 65 : 97;
return String.fromCharCode((char.charCodeAt(0) - base + n) % 26 + base)
}).join('');
}
처음에는 단순히 소문자, 대문자 알파벳 배열을 각각 만든 후 indexOf를 이용해 문제를 풀었었다.
하지만 그렇게 되면 코드가 너무 복잡해져서 가독성이 떨어졌다. 그래서 이 풀이로 풀게 되었다.
먼저 char이 빈 문자열이면 그냥 똑같이 리턴하도록 하고,
대문자인지 소문자인지 확인하기 위해 isUpper 변수에 char이 A ~ Z 사이에 있으면 true, 아니면 false 값을 담도록 한다.
그리고 알파벳을 아스키 코드로 나타내면 A는 65부터 시작하고 a는 97부터 시작하므로,
base 변수에 대문자라면 65, 아니면 97을 저장한다.
그 다음 우리가 원하는 값은 char에 해당하는 알파벳 인덱스에 + n 값이므로,
먼저 char의 아스키 코드를 charCodeAt(0)을 통해 얻어주고 여기서 base 값을 빼준 후 n을 더해준다.
그리고 % 26을 해주는 이유는 만약 z에서 1을 더해주면 a로 다시 시작하게끔 하기 위해서다.
예를 들어 char이 A라면 65 - 65 + 1 = 1이므로 여기에 base를 마지막으로 더해주면 66이 되니까 B가 나온다.
마지막으로 반환된 map을 통해 반환된 새 배열을 join을 통해 문자열로 바꿔주면 끝!
반응형
'코딩 테스트' 카테고리의 다른 글
[프로그래머스 Level 1] 문자열 내 맘대로 정렬하기 (0) | 2025.04.23 |
---|---|
[프로그래머스 Level 1] 숫자 문자열과 영단어 (0) | 2025.04.23 |
[프로그래머스 Level 1] 두 개 뽑아서 더하기 (0) | 2025.04.21 |
[프로그래머스 Level 0] 잘라서 배열로 저장하기 (0) | 2025.04.21 |
[프로그래머스 Level 0] 문자 개수 세기 (0) | 2025.04.20 |