백준 9012번: 괄호

kgh128·2023년 2월 4일

코드: https://github.com/kgh128/Problem-Solving/blob/main/src/Baekjoon/p9012.java


1. 괄호 문자열 입력받기

주어진 괄호 문자열을 입력받는다.

String ps = br.readLine();

2. 스택 연산

괄호 문자열 ps를 돌면서 스택 연산을 수행한다. 문자열을 돌 때 향상된 for문을 이용한다. char형으로 돌아야 하므로, toCharArray()를 이용하여 Stringpschar형 배열로 변환한다.

  • (인 경우: 스택에 넣는다.
  • )인데 스택에 (이 들어있는 경우: (을 스택에서 빼서 괄호 쌍을 만든다.
  • )인데 스택이 비어있는 경우: )와 짝을 이룰 (이 없으므로 올바른 괄호 문자열이 아니다.

위와 같이 스택 연산을 수행한다.

Stack<Character> stack = new Stack<>();
boolean isVps = true;

for (char p: ps.toCharArray()) {
	if (p == '(') {
		stack.push(p);
	}
	else if (p == ')' && !stack.empty()) {
		stack.pop();
	}
	else if (p == ')' && stack.empty()) {
		isVps = false;
		break;
	}
}

원래는 if문의 조건이 더 간단했지만, 가독성이 안좋아서 좀 더 길더라도 위와 같이 수정했다. 가독성과 코드 길이 사이의 중심을 잡는 게 힘든 것 같다.


3. 짝을 못이룬 '('가 남은 경우

스택 연산을 모두 수행했는데, 스택이 비어있지 않다는 것은 짝을 못이룬 (가 남았다는 의미이다. 이 경우도 마찬가지로 올바른 괄호 문자열이 아니다.

if (!stack.empty()) {
	isVps = false;
}

4. 결과 저장

isVps는 올바른 괄호 문자열인지 저장하는 변수이다. 이를 이용하여 출력 버퍼에 결과("YES" 또는 "NO")를 저장한다.

if (isVps) bw.append("YES\n");
else bw.append("NO\n");

0개의 댓글