백준 9012(괄호)

jh Seo·2022년 10월 22일
0

백준

목록 보기
59/194
post-custom-banner

개요

백준 9012번: 괄호

  • 입력
    입력 데이터는 표준 입력을 사용한다. 입력은 T개의 테스트 데이터로 주어진다. 입력의 첫 번째 줄에는 입력 데이터의 수를 나타내는 정수 T가 주어진다. 각 테스트 데이터의 첫째 줄에는 괄호 문자열이 한 줄에 주어진다. 하나의 괄호 문자열의 길이는 2 이상 50 이하이다.

  • 출력
    출력은 표준 출력을 사용한다. 만일 입력 괄호 문자열이 올바른 괄호 문자열(VPS)이면 “YES”, 아니면 “NO”를 한 줄에 하나씩 차례대로 출력해야 한다.

접근방법

  1. 스택을 이용해 '(' 값이 들어오면 스택 push해준다

  2. ')'값이 들어오면 스택의 top값인 '('을 pop해준다.

  3. 따라서 ')' 값이 들어왔을때 스택이 비어있거나 스택의 top값이 '('가
    아니라면 잘못된 입력값이다.

  4. 하지만 (과 )만 비교하는 중이므로 굳이 스택을 선언 안하고도 가능하다.

  5. 변수 cnt=0을 선언해준 뒤
    '('값이 들어오면 변수 cnt값을 증가시킨다.
    ')'값이 들어왔을 때 cnt가 0이하라면 잘못된 입력값임을 출력하고,
    cnt가 양수라면 cnt를 감소시켜주기만 하면 된다.

코드

#include<iostream>
#include<vector>

using namespace std;

int N;
vector<string> s;

void input() {
	string ps = "";
	cin >> N;
	for (int i = 0; i < N; i++) {
		cin >> ps;
		s.push_back(ps);
	}
}
	/// <summary>
	/// index번째 입력값의 괄호가 올바르게 되어잇는지 체크하는 함수
	/// </summary>
	/// <param name="index"></param>
	/// <returns></returns>
bool checkParenthesis(int index) {
	int cnt=0;
	for (int i = 0; i < s[index].length(); i++) {
		if (s[index][i] == '(')
			cnt++;
		else {
			//닫는 괄호가 들어왔을 때cnt가 0이거나 음수가 들어오면 안됨
			if (cnt <= 0)
				return false;
			cnt--;
		}
	}
	if (cnt == 0) return true;
	else return false;

}

void solution() {
	for (int i = 0; i < N; i++) {
		if (checkParenthesis(i)) {
			cout << "YES" << '\n';
		}
		else
			cout << "NO" << '\n';
	}
}

int main() {
	input();
	solution();
}

문풀후생

예전에 푼 방식을 봤는데 왼쪽 괄호가 들어왔다면 leftB값 증가시키고 rightB값 증가시키고
이런식으로 복잡하게 풀어놨었는 데, 변수 하나만 잡고 증감시키면 훨씬 간편하다

profile
코딩 창고!
post-custom-banner

0개의 댓글