https://www.acmicpc.net/problem/2504
코드설명
스택 자료구조를 활용하는 문제입니다.
문제에 대한 아이디어를 떠올려야 하는 문제입니다.
문제의 가장 중요한점은,
처음 '(' 혹은 '['가 들어가면서 먼저 변수값에 *2 혹은 * 3을 진행하며 나아갑니다.
만약 ')' 혹은 ']'를 만났을때는 이전 i-1값이 여는 괄호일경우 정답에 계산값을 더해줍니다.
닫는 괄호를 만났을떄는 /=2, /=3 을 통해서 이전값으로 돌려놓습니다.
코드로 보시면 이해하실 수 있을 것 입니다.
코드
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());
//연속적으로 닫는것이 나오면 X이고, 한번 닫은후, 여는것이 나오면 더하기임.
String input = st.nextToken();
int tempValue = 1;
for(int i=0;i<input.length();i++) {
if(input.charAt(i) == '(') { //'('를 만났을시에는 무조건 넣어줍니다.
stack.push('(');
tempValue *= 2; //만약 '('를 만나면 우선 *2 로 진행합니다.
}
else if(input.charAt(i) == '[') { // '['를 만낫을시에는 무조건 넣어줍니다.
stack.push('[');
tempValue *= 3; //만약 '['를 만나면 우선 *3 로 진행합니다.
}
else if(input.charAt(i) == ')') {
if(stack.isEmpty() || stack.peek() != '(') { //만약 ')'를 만났는데 전의 Stack값이 '('가 아니라면 틀린 문자열
answer = 0;
System.out.println("0");
return ;
}else if(input.charAt(i-1) == '(') { //만약 '[ ( ) ] 와 같은형태라고 가정해보자. 여기서 )를 만났을겨웅 이전의 값이 ( 이므로 해당값을 answer에 더해줍니다.
answer += tempValue;
}
stack.pop();
tempValue /= 2;
}
else if(input.charAt(i) == ']') {
if(stack.isEmpty() || stack.peek() != '[') {
answer = 0;
System.out.println("0");
return ;
}else if(input.charAt(i-1) == '[') {
answer += tempValue;
}
stack.pop();
tempValue /= 3;
}
}
if(!stack.isEmpty()) System.out.println("0");
else System.out.println(answer);
}
}
처음에 잘못푼코드
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());
//연속적으로 닫는것이 나오면 X이고, 한번 닫은후, 여는것이 나오면 더하기임.
String input = st.nextToken();
for(int i=0;i<input.length();i++) {
boolean meetFlag = false;
if(input.charAt(i) == '(') {
stack.push('(');
meetFlag = false;
}
else if(input.charAt(i) == '[') {
stack.push('[');
meetFlag = false;
}
else if(input.charAt(i) == ')' && meetFlag == false) {
stack.pop();
answer += 2;
meetFlag = true;
}else if(input.charAt(i) == ')' && meetFlag == true) {
stack.pop();
answer *= 2;
meetFlag = true;
}
else if(input.charAt(i) == ']' && meetFlag == false) {
stack.pop();
answer += 3;
meetFlag = true;
}else if(input.charAt(i) == ']' && meetFlag == true) {
stack.pop();
answer *= 3;
meetFlag = true;
}
}
System.out.println(answer);
}
}
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 2294 동전 2 - DP JAVA (0) | 2023.09.05 |
---|---|
[백준] 2293 동전 1 - DP JAVA (0) | 2023.09.05 |
[백준] 10799 쇠막대기 - 스택 + 자료구조 JAVA (0) | 2023.09.04 |
[백준] 1874 스택 수열 - 스택 + 자료구조 JAVA (0) | 2023.09.03 |
[백준] 1966 프린터 큐 - 덱 + 원형 JAVA (0) | 2023.09.03 |