문제 출처: https://programmers.co.kr/learn/courses/30/lessons/12909
괄호가 바르게 짝지어져있는지를 반환하는 함수를 만들어보았다. 마치 텍스트 에디터를 만드는 듯한 재미있는 문제였다. ‘(’ 괄호가 나오면 배열에 괄호를 추가하고, ‘)’ 괄호가 나오면 닫아줄 괄호가 있는지 확인한 뒤, 닫아서 없애고자 하였다. 자바스크립트 배열의 push(), pop() 메서드를 통해 스택 자료구조를 활용해보면 좋을 것 같아서 다음과 같이 코드를 작성해보았다.
function solution(s) {
if (s.length === 0) {
return true;
}
if (s[0] === ")") {
return false;
}
let stack = [];
for (const bracket of s) {
if (bracket === "(") {
stack.push(bracket);
} else if (bracket === ")") {
if (stack[stack.length - 1] === "(") {
stack.pop();
}
} else {
return false;
}
}
return stack.length === 0;
}
우선인풋으로 받을 문자열로 looping을 해야 했기 때문에, 빈 공백이 들어올 경우를 예외처리했다. 또한 괄호는 연 다음에 닫아줘야 하는데, 가장 먼저 닫는 괄호가 나오는 케이스도 예외처리를 통해 막아주었다. 이 다음부터는 스택으로 쓸 array가 등장하게 된다.
문자열을 순회하기 위해서 처음에는 split() 메서드를 통해 배열로 변환하고 그 배열을 순회하려고 했는데, 생각해보니 문자열도 순회가 가능했다. 따라서 불필요한 배열을 추가적으로 생성하지 않고 바로 문자열에서 loop를 돌렸다. 순회 결과가 되는 문자열의 character 하나하나는 무조건 괄호만 들어와야 했다. 따라서 기타 텍스트가 들어올 경우에는 false를 반환하여 순회 과정에서도 예외처리를 해주었다.
정상적인 괄호가 들어올 경우, 이 텍스트가 ‘(’ 괄호일 경우에는 스택에 괄호를 넣어주고, ‘)’ 괄호일 경우에는 기존의 ‘(’ 괄호 하나를 스택에서 제거해주는 방식으로 괄호 닫음 처리를 해보았다. 따라서 문자열 순회가 끝나고 나서도 스택에 괄호가 남아있을 경우 올바르지 않은 괄호라고 판단할 수 있다.
결론
- 자바스크립트 배열은 스택으로 쓰기 매우 편하다.
- 자바스크립트에서는 length프로퍼티를 가진 객체를 유사 배열객체(array-like objects) 라고 부른다. 문자열에서도 length를 사용할 수 있고, 배열처럼 순회도 가능하다. 굳이 불필요한 배열을 split()으로 만들 필요가 없다.
'Problem-Solving' 카테고리의 다른 글
[PS] 프로그래머스 프린터 구현 문제 (0) | 2022.03.01 |
---|