1. 9012번 괄호
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
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()); // 테스트 케이스 개수
StringBuilder sb = new StringBuilder(); // 결과를 저장할 StringBuilder
for (int i = 0; i < T; i++) {
String s = br.readLine();
if (isValidParenthesis(s)) {
sb.append("YES\n");
} else {
sb.append("NO\n");
}
}
System.out.print(sb.toString()); // 한 번에 출력하여 성능 최적화
}
public static boolean isValidParenthesis(String s) {
int count = 0; // '(' 개수를 저장할 변수
for (char c : s.toCharArray()) {
if (c == '(') {
count++; // 여는 괄호 증가
} else {
count--; // 닫는 괄호 감소
if (count < 0) { // 닫는 괄호가 더 많으면 NO
return false;
}
}
}
return count == 0; // 모든 괄호가 짝을 이루면 YES
}
}
2. 4949번 균형잡힌 세상
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.Stack;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder(); // 출력 최적화
while (true) {
String line = br.readLine();
if (line.equals(".")) break; // 종료 조건
sb.append(isBalanced(line) ? "yes\n" : "no\n");
}
System.out.print(sb.toString()); // 최종 출력
}
public static boolean isBalanced(String s) {
Stack<Character> stack = new Stack<>();
for (char c : s.toCharArray()) {
if (c == '(' || c == '[') {
stack.push(c); // 여는 괄호 push
} else if (c == ')') {
if (stack.isEmpty() || stack.pop() != '(') return false;
} else if (c == ']') {
if (stack.isEmpty() || stack.pop() != '[') return false;
}
}
return stack.isEmpty(); // 스택이 비어 있으면 균형 잡힌 문자열
}
}
- 대칭인지 확인하기위해 stack을 사용하면 된다.
3. 12789번 도키도키 간식드리미
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.Stack;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine()); // 학생 수
StringTokenizer st = new StringTokenizer(br.readLine());
Stack<Integer> stack = new Stack<>();
int order = 1; // 간식을 받을 학생 순서
for (int i = 0; i < N; i++) {
int student = Integer.parseInt(st.nextToken());
if (student == order) { // 순서가 맞으면 바로 간식 받기
order++;
} else {
stack.push(student); // 대기 공간(스택)에 보관
}
// 스택의 맨 위 값이 현재 순서와 맞으면 계속 간식 주기
while (!stack.isEmpty() && stack.peek() == order) {
stack.pop();
order++;
}
}
System.out.println(stack.isEmpty() ? "Nice" : "Sad");
}
}
- stack.peek() 기능 : stack에서 가장 마지막에 들어온 값이 무엇인지 알려준다. pop은 숫자를 꺼내는 메서드이지만, peek은 숫자만 알려주는 메서드이다.
'알고리즘 공부 > 백준' 카테고리의 다른 글
[JAVA 42일차 / 하루 3문제] 28279번, 2346번, 24511번 (0) | 2025.03.28 |
---|---|
[JAVA 41일차 / 하루 3문제] 18258번, 2164번, 11866번 (0) | 2025.03.27 |
[JAVA 39일차 / 하루 3문제] 13909번, 28278번, 10773번 (0) | 2025.03.25 |
[JAVA 38일차 / 하루 3문제] 13241번, (0) | 2025.03.19 |
[JAVA 37일차 / 하루 3문제] 1269번, 11478번, 1934번 (0) | 2025.03.18 |