Problem
괄호가 바르게 짝지어졌다는 것은 '(' 문자로 열렸으면 반드시 짝지어서 ')' 문자로 닫혀야 한다는 뜻입니다. 예를 들어
"()()" 또는 "(())()" 는 올바른 괄호입니다.
")()(" 또는 "(()(" 는 올바르지 않은 괄호입니다.
'(' 또는 ')' 로만 이루어진 문자열 s가 주어졌을 때, 문자열 s가 올바른 괄호이면 true를 return 하고, 올바르지 않은 괄호이면 false를 return 하는 solution 함수를 완성해 주세요.
제한사항
- 문자열 s의 길이 : 100,000 이하의 자연수
- 문자열 s는 '(' 또는 ')' 로만 이루어져 있습니다.
Solution
스택, 큐 문제
function solution(s){
let now = [];
s = s.split('');
while (0 < s.length) {
let target = s.pop();
if(now === '') now.push(target);
if(target === '('){
if(now[now.length-1] === ')') now.pop();
else now.push(target);
}
else now.push(target);
}
return now.length === 0 ? true : false;
}
s를 뒤부터 하나씩 빼와서 target 변수에 넣은 후에
now에 있는 요소랑 비교해서 now의 마지막 요소가 ')'이고 현재 target이 '('이라면 now의 마지막 요소 제거한다.
( ) -> 이렇게가 한세트인데 나는 pop을 이용하여 뒤부터 빼오므로 ) ( 형태가 한세트이다.
위의 조건 외에는 target을 now에 push한다.
모든 s를 다 돌고 난 후에 now배열에 아무것도 없다면 true, 있다면 false를 반환하도록 해주었다.
내가 푼 풀이는 배열을 굳이 하나 더 생성해서 push, pop을 이용해서 푼 문제였는데
다른 사람 풀이를 보니 나처럼 배열을 하나 더 안 만들어도 풀 수 있었다
function solution(s){
let cum = 0
for (let paren of s) {
cum += paren === '('? 1: -1
if(cum < 0) {
return false
}
}
return cum === 0? true: false;
}
위의 식이라면 (((()))) 문제를 예시로 들면
( 은 +1, )은 -1을 한다.
(((( -> cum이 4인 상태
)))) -> cum이 0인 상태 이므로
모두 유효한 식이라면 cum = 0 이어야 한다
위의 식이 더 효율적이라고 느꼈다.
'프로그래머스 (JS) > Lv. 2' 카테고리의 다른 글
[Programmers / JS] 12980번 - 점프와 순간 이동 (0) | 2023.04.17 |
---|---|
[Programmers / JS] 12985번 - 예상 대진표 (0) | 2023.04.17 |
[Programmers / JS] 42885번 - 구명보트 (0) | 2023.04.17 |
[Programmers / JS] 42842번 - 카펫 (0) | 2023.04.17 |
[Programmers / JS] 12973번 - 짝지어 제거하기 (0) | 2023.04.10 |