• 문제 링크
4949번: 균형잡힌 세상
하나 또는 여러줄에 걸쳐서 문자열이 주어진다. 각 문자열은 영문 알파벳, 공백, 소괄호("( )") 대괄호("[ ]")등으로 이루어져 있으며, 길이는 100글자보다 작거나 같다. 각 줄은 마침표(".")로 끝난다
www.acmicpc.net
• 풀이 과정
하나 또는 여러 줄의 입력된 문자열이 "." 일 때까지 문자열을 입력받는다.
미리 생성한 제네릭이 Character 인 Stack 에 각 문자열 처리 완료시마다 clear 하여 비운다.
각각의 문자열을 토큰 단위로 쪼개어 토큰이 여는 괄호일 시 ('(' || '[') 스택에 push 하고,
닫는 괄호일 시 (')' || ']') 스택이 비어있지 않고, peek 으로 확인한 스택 상단의 값이 토큰과 짝이 맞는 여는 괄호일 시
해당 여는 괄호를 pop 하여 제거한다.
그렇지 않다면 닫는 괄호 또한 스택에 push 한다.
이러한 과정을 거친 후 문자열이 올바르게 여는 괄호에 상응하는 닫는 괄호로 이루어진 문자열이라면
스택이 비어있을 것이고, 아니라면 잔여 토큰이 남아있을 것이다.
이에 따라 stk.empty() ? "yes" : "no" 삼항 연산자를 통해 정답을 출력한다.
• 풀이 코드
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Stack;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
Stack<Character> stk = new Stack<>();
while (true) {
String input = br.readLine();
if (input.equals("."))
break;
stk.clear();
for (int i = 0; i < input.length(); i++) {
char token = input.charAt(i);
if (token == '(' || token == '[')
stk.push(token);
else if (token == ')' && !stk.empty() && stk.peek() == '(')
stk.pop();
else if (token == ']' && !stk.empty() && stk.peek() == '[')
stk.pop();
else if (token == ')' || token == ']')
stk.push(token);
}
bw.write((stk.empty() ? "yes" : "no") + "\n");
}
bw.flush();
}
}
'Problem Solving > Baekjoon' 카테고리의 다른 글
[백준] 1021 회전하는 큐 - Data Structure / Java (0) | 2022.11.04 |
---|---|
[백준] 15828 Router - Data Structure / Java (0) | 2022.11.03 |
[백준] 10773 제로 - Data Structure / Java (0) | 2022.11.01 |
[백준] 1647 도시 분할 계획 - Graph Theory / Java (0) | 2022.10.31 |
[백준] 1613 역사 - Graph Theory / Java (0) | 2022.10.30 |
댓글