Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 더베일리하우스 삼성점
- fragmentcontainer
- 패스트파이브
- 중첩네비게이션
- 코틀린
- 재밌긴함
- Android
- parentfragment
- innernavigation
- 백준
- 내부프레그먼트
- 스택
- 패파
- 사무실
- 공유오피스
- 안드로이드
- media3 transformer
- 가든웨딩
- 자바
- Stack
- 너무 어렵다
- 아키텍쳐
- 후기
- Kotlin
- media3
- 파이썬
- SAA
- MVVM
- rxandroid
- 알고리즘
Archives
삽질도사
[백준] 2504 괄호의 값 자바 본문
반응형
https://www.acmicpc.net/problem/2504
2504번: 괄호의 값
4개의 기호 ‘(’, ‘)’, ‘[’, ‘]’를 이용해서 만들어지는 괄호열 중에서 올바른 괄호열이란 다음과 같이 정의된다. 한 쌍의 괄호로만 이루어진 ‘()’와 ‘[]’는 올바른 괄호열이다. 만일
www.acmicpc.net
1년 전에 한번에 풀었던 문제인데, 이제보니까 죽어도 모르겠어서 과거의 내 답지를 한번 보고
다시 풀었는 데 그래도 몇 번 틀렸습니다 ;ㅁ; (그래도 본인 골드1인데..)
반례가 많은 문제여서 심지어 문제를 읽어보면 문제에 반례가 적혀있습니다.
하여튼 핵심은 재귀함수를 사용해서 '(' 또는 '[' 에서 내부에 괄호가 있는 지 확인하는게 핵심입니다.
그리고 괄호가 올바른 지의 유무를 따지는 것은 스택을 사용해서 확인합니다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
public class 괄호의값 {
static int n, ans = 0;
static String str = "";
static boolean[] visited = new boolean[31];
static Stack<Character> stk = new Stack<>();
// (()[[]])([])
static int dfs(int idx, int val) {
char c = str.charAt(idx);
char goal;
int sum = 0;
int val2 = 0;
visited[idx] = true;
stk.add(c);
if (c == '(')
goal = ')';
else
goal = ']';
for (int x = idx + 1; x < str.length(); x++) {
char next = str.charAt(x);
if (visited[x])
continue;
if (next == '(') {
val2 = 2;
// sum += dfs(x, val2); 다음 괄호의 모양에 따라 dfs를 사용하면 올바르지 못한 괄호같은 반례를 쳐낼 수가 없다 (올바르지 못한 괄호를 지나쳐버려서)
} else if (next == '[') {
val2 = 3;
// sum += dfs(x, val2);
}
if (next == goal) { // ( [
stk.pop();
visited[x] = true;
if (sum == 0) {
return val;
} else {
return val * sum;
}
}
else { //else문으로 올바르지 못한 괄호까지 처리할 수 있게 해주어야 stack처리가 되어서 반례에 0이 나온다
sum += dfs(x, val2);
}
}
return sum * val;
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
str = br.readLine();
for (int x = 0; x < str.length(); x++) {
if (!visited[x]) {
int v = 0;
if (str.charAt(x) == '(')
v = 2;
else if (str.charAt(x) == '[')
v = 3;
ans += dfs(x, v);
}
}
if (stk.size() != 0)
System.out.println(0);
else
System.out.println(ans);
}
}
반응형
'백준' 카테고리의 다른 글
[백준] 1113번 수영장만들기 코틀린 (0) | 2024.02.08 |
---|---|
[백준] 15683 감시 삼성 SW 역량 테스트 기출 문제 (2) | 2024.01.25 |
[백준] 10799 쇠막대기 자바 (0) | 2021.12.27 |
[백준] 빗물 14719 자바 (0) | 2021.03.24 |
[백준] 달력 20207 자바 (0) | 2021.03.23 |