https://www.acmicpc.net/problem/4949
세계는 균형이 잘 잡혀있어야 한다. 양과 음, 빛과 어둠 그리고 왼쪽 괄호와 오른쪽 괄호처럼 말이다.
정민이의 임무는 어떤 문자열이 주어졌을 때, 괄호들의 균형이 잘 맞춰져 있는지 판단하는 프로그램을 짜는 것이다.
문자열에 포함되는 괄호는 소괄호("()") 와 대괄호("[]")로 2종류이고, 문자열이 균형을 이루는 조건은 아래와 같다.
정민이를 도와 문자열이 주어졌을 때 균형잡힌 문자열인지 아닌지를 판단해보자.
하나 또는 여러줄에 걸쳐서 문자열이 주어진다. 각 문자열은 영문 알파벳, 공백, 소괄호("( )") 대괄호("[ ]")등으로 이루어져 있으며, 길이는 100글자보다 작거나 같다. 각 줄은 마침표(".")로 끝난다.
입력의 종료조건으로 맨 마지막에 점 하나(".")가 들어온다.
각 줄마다 해당 문자열이 균형을 이루고 있으면 "yes"를, 아니면 "no"를 출력한다.
예제 1 입력
So when I die (the [first] I will see in (heaven) is a score list).
[ first in ] ( first out ).
Half Moon tonight (At least it is better than no Moon at all].
A rope may form )( a trail in a maze.
Help( I[m being held prisoner in a fortune cookie factory)].
([ (([( [ ] ) ( ) (( ))] )) ]).
.
.예제 1 출력
yes
yes
no
no
no
yes
yes
7번째의 " ."와 같이 괄호가 하나도 없는 경우도 균형잡힌 문자열로 간주할 수 있다.
filter
메서드로 걸러서 브라켓만 남기고, 그 결과로 반환된 배열에 forEach
를 돌려서 조건을 판별한다.isYes
를 false
로 바꿔준다. const fs = require('fs');
const root = process.platform === 'linux' ? '/dev/stdin' : './input.txt';
const input = fs.readFileSync(root, 'utf8').toString().trim().split('\n').slice(0,-1).map(a=> a.split(''));
solution(input);
function solution(input) {
input
.map(a=> a.filter(a=> a === '[' || a === ']' || a === '(' || a === ')'))
.forEach(a => {
let stack = [];
let isYes = true;
for (let i = 0; i < a.length; i++) {
//브라켓이 없을 경우 동작없이 순회 종료
if(a.length === 0) break;
// 순회를 돌면서 여는 브라켓이 등장할 경우 스택에 넣는다.
let bracket = a[i];
if (bracket === "(" || bracket === "[") {
stack.push(bracket);
}
// 닫는 브라켓이 등장하는 경우
if (bracket === ")" || bracket === "]") {
// 스택에서 브라켓을 빼고 그값을
let lastStack = stack.pop();
// 현재 순서의 닫는 브라켓과 비교하여 정합하는지 판별한다.
if ((bracket === ")" && lastStack !== "(") || (bracket === "]" && lastStack !== "[")) {
// 정합하지 않는 경우 isYes에 false를 저장하고 빠져나온다
isYes = false;
break;
}
}
}
// 스택에 여는 브라켓이 남아있는 경우(닫히지 않은 경우)에도 no를 출력한다.
if (stack.length !== 0) {
isYes = false;
}
//isYes의 값에 따라 조건부로 출력한다.
console.log(isYes ? "yes" : "no");
});
};