[JS] 괄호 문자열 검증
괄호 문자열 검증
’(‘, ‘)’, ‘{‘, ‘}’, ‘[’ 및 ‘]’ 만 포함하는 문자열이 주어지면 입력 문자열이 유효한지 확인하자. 다음과 같은 경우 입력 문자열이 유효합니다. 열린 괄호와 동일한 유형의 괄호로 닫아야 합니다. 열린 괄호는 올바른 순서로 닫아야 합니다. 유효하면 true, 아니면 false를 리턴합니다.
Input)
()
Output)
true
Input)
()[]{}
Output)
true
Input)
(]
Output)
false
Input)
(({{}}[]))
Output)
true
접근방식
열린, 닫힌 괄호를 객체로 생성하여 두고, 입력 문자열을 반복하며 현재요소가 괄호객체에 key, value 값으로 존재하는지 여부를 확인하여 검증하는 방식으로 접근하였다.
문제
- 단순히 t배열이 빈배열을 만들면 될 것이라 생각했는데, ‘())’의 경우 앞의 ‘()’를 통해 빈배열을 만들 수 있지만 남은 ‘)’ 때문에 문제가 발생하였다.
- t배열의 마지막요소를 key값으로 value값을 찾을 때 괄호 유형이 다를 경우 문제가 발생하였다. ex) ‘([)]’
문제해결
ele(현재요소)가 t배열의 마지막원소를 key값으로 조회한 value값과 일치하지 않는 경우 false를 반환하도록 구현하였다.
1
2
3
4
5
6
7
8
9
10
11
12
13
function bracket_input(input) {
let map={ '(':')', '{':'}', '[':']' }, keys=Object.keys(map), l=input.split(''), t=[], result=true;
for (let ele of l) {
if(keys.includes(ele)) { t.push(ele); }
else {
if(ele === map[t.at(-1)]) { t.pop(); }
else { result=false; return result; }
}
}
// input값이 유효하다면 t배열은 빈 배열이 되고(true), 배열에 값이 있다면 짝이 안맞는 괄호값이 존재(false)
if(t.length !== 0) { result=false; return result; }
return result;
}
소스 리뷰
4 line
1
2
3
4
for (let ele of l) {
if(keys.includes(ele)) { t.push(ele); }
...
}
ele(현재요소)가 map(괄호객체)에 key값으로 존재한다면 t(빈배열) 맨뒤에 값을 넣음.
6 line
1
if(ele === map[t.at(-1)]) { t.pop(); }
ele(현재요소)가 조회한 value값과 일치하면 괄호의 짝이 맞으므로 t배열에서 마지막요소 삭제함.