Algorithm/구현
괄호의 값
codejcd
2022. 12. 14. 01:20
문제
https://www.acmicpc.net/problem/2504
분석/설계
Stack 자료구조를 활용하여, 문제의 조건들을 구현 가능합니다.
1. 입력받은 문자열을 각각의 문자로 쪼개 확인합니다.
2. 문자의 각 괄호가 '(' , '[' 이면 2, 3을 곱해줍니다.
3. 문자의 괄호가 ')'의 경우
3.1 스택이 비어있거나 '('이 없는 경우 결과 값을 0으로 수정.
3.2 이전 문자 값이 '(' 일 경우 결과 값에 더해주고, Stack에서 제거.
4. 문자의 괄호가 ']' 경우
4.1 스택이 비어있거나 '['이 없는 경우 결과 값을 0으로 수정.
4.2 이전 문자 값이 '[' 일 경우 결과 값에 더해주고, Stack에서 제거.
구현 코드
import java.util.Scanner;
import java.util.Stack;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.next();
Stack<Character> stack = new Stack<>();
int res = 0;
int val = 1;
for (int i=0; i<str.length(); i++) {
char c = str.charAt(i);
if (c == '(' ) {
stack.push(c);
val *= 2;
} else if(c == '[') {
stack.push(c);
val *= 3;
} else if(c == ')') {
if(stack.isEmpty() || stack.peek() != '(') {
res = 0;
break;
} else if(str.charAt(i-1) == '(') {
res += val;
}
stack.pop();
val /= 2;
} else if(c == ']') {
if(stack.isEmpty() || stack.peek() != '[') {
res = 0;
break;
} else if(str.charAt(i-1) == '[') {
res += val;
}
stack.pop();
val /= 3;
}
}
if(!stack.isEmpty()) {
res = 0;
}
System.out.println(res);
sc.close();
}
}
정리
조건들을 잘 읽고 어떻게 구현할지 쪼개서 생각해봐야 합니다.
Java에서 Stack과 문자열 다루는 메서드들에 대해서는 익숙해질 필요가 있습니다.
- push(item): item 하나를 스택의 가장 윗부분에 삽입.
- peek(): 스택의 가장 위에 있는 항목을 반환.
- pop(): 스택에서 가장 위에 있는 항목을 삭제하고 해당 item을 반환.
- isEmpty(): 스택이 비어있는지 유무에 따라 true/false를 반환.