자료구조 & 알고리즘/코딩테스트

[JavaScript/코딩테스트] <백준 - 9012번 괄호>

칠구의 스터디 2024. 10. 10. 21:43

http://(https://www.acmicpc.net/problem/9012

 

예제 입력

6
(())())
(((()())()
(()())((()))
((()()(()))(((())))()
()()()()(()()())()
(()((())()(

 

예제 출력

NO
NO
YES
NO
YES
NO

 

 

풀이

 

문제 자체는 어렵지 않다

열린 괄호 '(' 와 닫힌 괄호 ')'  가 정상적으로 배치되어  올바른 괄호인지 확인하는 문제이다.

 


틀린 정답

 

const input = require('fs')
  .readFileSync('/dev/stdin')
  .toString()
  .trim()
  .split('\n');

let N = Number(input[0]);
let result = [];

for (let i = 1; i <= N; i++) {
  if (input[i].length % 2 !== 0) {
    result.push('NO');
  } else {
    const X = input[i].split('');

    let mid = input[i].length / 2;
    let left = X.slice(0, mid);
    let right = X.slice(mid);

    // right 배열을 복사하여 뒤집고, left와 비교
    if (JSON.stringify(left) === JSON.stringify(right.slice().reverse())) {
      result.push('YES');
    } else {
      result.push('NO');
    }
  }
}

console.log(result.join('\n'));

 

나는 문제를 보면 자료 구조 '스택'에 관한 문제이기 때문에

데칼코마니처럼 배열의 길이를 반으로 각각 나눠

왼쪽과 오른쪽 값이 같으면 정답인줄 알았다

하지만

(()())((()))

이거와 같이 [(()))] [((()))] 왼쪽과 오른쪽으로 나눴을 때

내 코드 기준에선 올바른 괄호가 아니지만 실제론 올바른 괄호였다.... 

 


 

const input = require('fs')
.readFileSync('/dev/stdin')
.toString()
.trim()
.split('\n')

const N = Number(input[0])
let result = []; //최종 정답

for(let i =1; i <= N; i++){
    let tmp = []; //스택으로 사용할 용도
    let fact = true;
    
    for(const x of input[i]){
        
        // case 1
        if(x == '('){
            tmp.push(x)
        }
        //  case 2
        else{
            // case 2.1
            if(tmp.length == 0){
               fact = false
                break
               }
                case 2.2
               tmp.pop()
        }
    }   
        if(fact && tmp.length == 0){
            result.push("YES")
        }else{
            result.push("NO")
        }
    }

console.log(result.join('\n'))

 

이거 역시 '스택'을 사용한 풀이지만  

위에 코드와는 다르게 올바른 괄호인지 확인 할 수 있다.

 

'(' 이거 일 때 스택에 넣고 아닐 때 빼는 코드이다.

fact 변수를 통해 괄호가 올바른지 아닌지 구별했다

위의 이미지는 마지막 스택에 tmp는 비어있지만 fact 가 false이기 때문에 "NO"를 출력한다.