[백준/JAVA] 9012번: 괄호
🔺 문제
9012번: 괄호
괄호 문자열(Parenthesis String, PS)은 두 개의 괄호 기호인 ‘(’ 와 ‘)’ 만으로 구성되어 있는 문자열이다. 그 중에서 괄호의 모양이 바르게 구성된 문자열을 올바른 괄호 문자열(Valid PS, VPS)이라고
www.acmicpc.net
🔺 코드
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine());
String[] arr = new String[T];
for(int i = 0 ; i < T ; i++) {
Stack<String> stack = new Stack<>();
String[] ss = br.readLine().split("");
for(int j = 0 ; j < ss.length ; j++) {
if(ss[j].equals("(")) {
stack.push("(");
}
else { // (ss[j].equals(")"))
if(stack.isEmpty()) {
stack.add(")");
}
else if(!stack.isEmpty() && stack.peek().equals("(")){
stack.pop();
}
}
}
arr[i] = stack.isEmpty() ? "YES" : "NO";
}
for(String result : arr) {
System.out.println(result);
}
}
}
✅ 해결 아이디어
- 스택
- 여는 괄호인 경우 : 스택에 값 추가
- 닫는 괄호인 경우
└ 1) 스택이 비어있는 경우, 스택에 값 추가 (21-22번째 줄)
└ 2) 스택이 비어있지 않고, 최상위 값이 여는 괄호일 때, 스택의 최상위 값 삭제 (24-25번째 줄)
- 스택이 비어있다면, 올바른 괄호 문자열이라 "YES" / 안 비어있다면 "NO"
🔺 다른 풀이들
- 풀이1) Stack<Character>
[백준 9012번] java(자바) 스택(stack) 개념과 활용 - 자료구조
괄호 문제 괄호 문자열(Parenthesis String, PS)은 두 개의 괄호 기호인 ‘(’ 와 ‘)’ 만으로 구성되어 있는 문자열이다. 그 중에서 괄호의 모양이 바르게 구성된 문자열을 올바른 괄호 문자열(Valid PS,
konkukcodekat.tistory.com
스택을 Character형으로 받으셨다.
- 풀이2) StringBuilder로 출력
[백준] 9012번 : 괄호 – JAVA [자바]
https://www.acmicpc.net/problem/9012 9012번: 괄호 괄호 문자열(Parenthesis String, PS)은 두 개의 괄호 기호인 ‘(’ 와 ‘)’ 만으로 구성되어 있는 문자열이다. 그 중에서 괄호의 모양이 바르게 구성된 문자열
propercoding.tistory.com
StringBuilder로 출력하셨다.
- 풀이3) 중간에 break문 처리
[백준 9012번] - 괄호 java
https://www.acmicpc.net/problem/9012 9012번: 괄호 괄호 문자열(Parenthesis String, PS)은 두 개의 괄호 기호인 ‘(’ 와 ‘)’ 만으로 구성되어 있는 문자열이다. 그 중에서 괄호의 모양이 바르게 구성된 문자열
connie.tistory.com
break문 쓰실 생각을,,,!
그리고 중간에 stack.clear();
이것도 하셨다.
💬 느낀 점
스택 재밌어~~ 프로그래머스에서도 이런 비슷한 문제가 있다. (올바른 괄호)
https://school.programmers.co.kr/learn/courses/30/lessons/12909
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
(+12.5 2회독)
스택에 Character형으로 괄호를 받고, StringBuilder를 활용해 출력했다.
코드 확인하기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int T = Integer.parseInt(br.readLine());
while(T --> 0) {
String str = br.readLine();
sb.append(solve(str) ? "YES" : "NO");
sb.append("\n");
}
System.out.println(sb);
}
private static boolean solve(String str) {
Stack<Character> stack = new Stack<>();
char[] ch = str.toCharArray();
for(int i = 0 ; i < ch.length ; i++) {
if(ch[i] == '(') {
stack.push('(');
}
else {
if(!stack.isEmpty() && stack.peek() == '(') {
stack.pop();
}
else {
stack.push(ch[i]);
}
}
}
if(stack.isEmpty())
return true;
return false;
}
}
|
cs |
(+12.22 3회독)
코드 확인하기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int N = Integer.parseInt(br.readLine());
while(N --> 0) {
char[] ch = br.readLine().toCharArray();
Stack<Character> stack = new Stack<>();
for(int i = 0 ; i < ch.length ; i++) {
if(ch[i] == '(') {
stack.push('(');
}
else {
if(!stack.isEmpty() && stack.peek() == '(') {
stack.pop();
}
else {
stack.push(')');
}
}
}
sb.append(stack.isEmpty() ? "YES" : "NO").append("\n");
}
System.out.println(sb);
}
}
|
cs |