알고리즘 문제 풀이
[LeetCode] 917. Reverse Only Letters
_OB1N
2021. 9. 15. 10:13
문제 출처: https://leetcode.com/problems/reverse-only-letters/
Reverse Only Letters - LeetCode
Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.
leetcode.com
문제
문자열 s를 다음 규칙에 따라 역순으로 배치하라:
- 영어 알파벳이 아닌 다른 모든 문자는 원래 위치를 유지하라.
- 영어 알파벳(대·소문자)은 역순으로 배치하라.
s를 뒤집은 후의 문자열을 반환하라.
예제
Input: s = "ab-cd"
Output: "dc-ba"
Input: s = "a-bC-dEf-ghIj"
Output: "j-Ih-gfE-dCba"
Input: s = "Test1ng-Leet=code-Q!"
Output: "Qedo1ct-eeLg=ntse-T!"
풀이
문자열을 뒤집기 위해서 스택(Stack) 자료구조를 사용할 수 있습니다.
스택은 LIFO(Last In First Out, 후입선출) 형태의 자료구조이기 때문에 문자열을 앞에서부터 순서대로 스택에 넣고, 하나씩 빼면서 문자열을 만들면 뒤집힌 문자열을 얻을 수 있는 것입니다.
문제에서 순서가 뒤집혀야 되는 문자는 알파벳만 해당되기 때문에 스택에 s의 모든 문자를 넣는 것이 아닌! 알파벳만 넣어야 합니다. 즉, 문자를 구분해야 해야 합니다.
문자열을 구분하기 위해 아스키(ASCII) 코드를 이용할 수 있습니다. 아스키 코드에서 알파벳은 65~90, 97~122번이 각각 대문자와 소문자를 가리키는 코드입니다. 이를 활용하여 다음과 같이 주어지는 문자가 알파벳인지 아닌지를 판별할 수 있습니다.
var isAlpha = function(char) {
const code = char.charCodeAt(0);
return (65 <= code && code <= 90) || (97 <= code && code <= 122);
}
이제 본격적으로 s의 알파벳만 스택에 넣고 빼는 방식으로 문자열을 뒤집을 수 있습니다.
var reverseOnlyLetters = function(s) {
let stack = [];
let answer = s.split('');
// 스택에 알파벳을 넣는 과정
for (let i = 0; i < s.length; i++) {
if (isAlpha(s[i])) {
stack.push(s[i]);
}
}
// 스택의 값을 pop하면서 문자를 뒤집는 과정
for (let i = 0; i < s.length; i++) {
if (isAlpha(answer[i])) {
answer[i] = stack.pop();
}
}
return answer.join('');
};