https://www.acmicpc.net/problem/10799
코드설명
스택 자료구조를 활용합니다.
문제로직입니다.
1. '('를 만나면 Stack에 넣습니다.
2. ')'를 만나면 2가지로 나눠집니다.
2-1. '()' 인경우, 즉 레이저인경우는 우선 Stackpop 한뒤 현재 Stack.Size = 쇠막대기 자르는 개수
2-2. '( ( ) )' 인경우에서 바깥쪽 괄호를 의미합니다 이 경우 전체 쇠막대기를 자르는것이 아닌 1개만 남은 것을 자르는것이므로 +1 만 처리합니다.
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Stack;
import java.util.StringTokenizer;
public class Main {
public static int N;
public static int answer = 0;
public static Stack<Character> stack = new Stack<>();
public static StringBuilder sb = new StringBuilder();
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
String input = st.nextToken();
for(int i=0;i<input.length();i++) { //문제에서 레이저를 만날때만 Stack의 Size만큼 더해주고, 레이저가 아닌 잘린 막대기인 경우 ')' 일경우 +1 처리하여 진행합니다.
if(input.charAt(i) == '(') { //'(' 라면 Stack에 추가합니다.
stack.push(')');
}
else if(input.charAt(i) == ')') { //')'라면 Stack에 추가합니다.
stack.pop(); // ')'를 만났으니 '(' 한개를 뻅니다.
if(input.charAt(i-1) == '(') { // 만약 '()' 모양이라면 레이저이므로 Stack의 크기만큼 더합니다.
answer += stack.size();
}else { //만야 '(())' 이런 형태이면 밖의 괄호는 레이저가 아닌, 쇠막대기입니다. +1 처리합니다.
answer += 1;
}
}
}
System.out.println(answer);
}
}
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 2293 동전 1 - DP JAVA (0) | 2023.09.05 |
---|---|
[백준] 2504 괄호의 값 - 스택 + 자료구조 JAVA (0) | 2023.09.04 |
[백준] 1874 스택 수열 - 스택 + 자료구조 JAVA (0) | 2023.09.03 |
[백준] 1966 프린터 큐 - 덱 + 원형 JAVA (0) | 2023.09.03 |
[백준] 1966 프린터 큐 - 구현 + 큐 JAVA (0) | 2023.09.02 |