728x90
문제
https://programmers.co.kr/learn/courses/30/lessons/12926?language=javascript
코드
function solution(s, n) {
return s.split("").map((i) => {
if (i === " ") return " "; //공백은 그냥 공백 출력
let unicode = i.charCodeAt(); //s의 각 문자의 유니코드
return i.toUpperCase().charCodeAt() + n > 90 ? String.fromCharCode(64 + (n - (90 - unicode))) : String.fromCharCode(unicode + n);
}).join("");
}
후기
- 문제 이해 : 문자열 s의 각 문자 하나씩을 다 +n만큼 한 문자열로 반환하기 (단, z나 Z의 경우에는 a, A로 반환)
- 보자마자 아스키코드를 이용해야겠다는 생각이 들었고, 아스키코드 표와 관련함수를 먼저 찾아봤다. 아스키코드를 구하는 함수는 대표적으로 두 가지가 있었다.
- charCodeAt() : 문자열을 아스키코드 숫자로 바꾸어준다
- fromCharCode() : 아스키코드 숫자를 문자열로 바꾸어준다
- 아스키코드 표 참고한 블로그 : https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=diceworld&logNo=220175224345
- 표를 보고 먼저 A,Z,a,z 의 아스키코드 번호를 파악했다 (Z=90, A=65, z=122, a=97)
- Level1 문제치곤 로직을 짜는게 조금 까다로웠다. 처음엔 쉽다고 생각하여 문자열 s의 각 문자들에 +n 만큼 한 아스키코드 번호를 구하고 해당 번호가 90(Z), 122(z)를 각각 넘으면 A,a로 돌아가 다시 계산하겠단 식으로 로직을 짰지만 90을 넘어가면 소문자 a-z 문자들에도 걸쳐지기 때문에 상당히 복잡해졌다
- 그래서 우선 각 문자들을 대문자화해서 아스키코드 번호가 Z를 넘어간다면 (64 + (n - (90 - unicode))) 의 로직으로 해당 아스키코드의 문자를 반환하게 풀이했다. 왜 저런 로직을 쓰는지 이해하기 위해서는 아스키코드표를 보며 직접 이해해보는 것이 좋다고 생각한다! 이걸 이해하는 데 은근 시간을 쏟은 문제였다
'알고리즘 > Programmers' 카테고리의 다른 글
[Programmers] 핸드폰 번호 가리기 / JavaScript (0) | 2022.01.20 |
---|---|
[Programmers] 문자열 내림차순으로 배치하기 / JavaScript (0) | 2022.01.20 |
[Programmers] 문자열 내 p와 y의 개수 / JavaScript (0) | 2022.01.20 |
[Programmers] 나누어 떨어지는 숫자 배열 / JavaScript (0) | 2022.01.20 |
[Programmers] 문자열 내 마음대로 정렬하기 / JavaScript (0) | 2022.01.18 |