
계산 수식이 주어졌을 때, 같은 짝의 괄호 위치를 찾는 프로그램을 제작하시오. 입력은 계산 수식으로 주어지며, 괄호의 짝 별 위치를 [시작, 끝] 으로 찾아 2차원 배열 형태로 반환한다. 위치 시작 값은 0으로 시작하며, 하나라도 짝이 맞지 않을 경우 빈 배열을 반환한다.
입출력 예
| expression | return |
|---|---|
| (a+b) | [0, 4] |
| (a*(b+c)+d) | [[3, 7],[0, 10]] |
| (a*(b+c)+d+(e) | [] |
| (a*(b+c)+d)+e) | [] |
| (a(b+c)+d)+(e(f+g)) | [[3, 7], [0, 10], [15, 19], [12, 20]] |
마찬가지로 스택을 이용한다. 알파벳은 무시하고, 전과 같이 여는 괄호가 있다면 우선 스택에 넣고, 닫는 괄호가 있다면 유의한다.
만약 닫는 괄호가 나왔는데도 스택이 텅 비어있다면 이는 짝이 맞지 않는다는 의미이므로 빈 배열을 반환하고 종료한다. 짝이 맞는다면 result 를 반환한다.
result의 경우, for문을 돌면서 조건문을 만족할 때, stack.pop() 된 요소 (여는 괄호) 와, i 번째 요소를 함께 반환한다.
여기서 만약 pop 되지 않은 요소가 있다면 이는 역시 짝이 맞지 않는다는 의미이므로 빈 배열을 반환한다.
function answer(str) {
const stack = [];
let result = [];
for(let i=0; i<str.length; i++){
if (str[i] === '('){
stack.push(i);
} else if (str[i] === ')'){
if (stack.length === 0){
return [];
}
result.push([stack.pop(), i]);
}
}
if (stack.length !== 0) result = [];
return result;
}
result.push([stack.pop(), i]); 부분을 유의해야 한다.