Skip to content

Instantly share code, notes, and snippets.

@mingyu-lee
Created July 19, 2018 03:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mingyu-lee/33e47b0f9eef60d0723931570f1032a4 to your computer and use it in GitHub Desktop.
Save mingyu-lee/33e47b0f9eef60d0723931570f1032a4 to your computer and use it in GitHub Desktop.
BOJ_2504_Value of Bracket
import java.util.Scanner;
import java.util.Stack;
public class Main {
private static final String OPEN_BRACKET = "(";
private static final String CLOSE_BRACKET = ")";
private static final String OPEN_SQUARE_BRACKET = "[";
private static final String CLOSE_SQUARE_BRACKET = "]";
private static final String BRACKET_VALUE = "2";
private static final String SQUARE_BRACKET_VALUE = "3";
public static void main(String[] args) {
new Main().solve();
}
private void solve() {
Scanner sc = new Scanner(System.in);
String[] inputArray = sc.nextLine().split("");
Stack<String> stringStack = new Stack<>();
int length = inputArray.length;
int valueChk = 0;
int ret = 0;
for (int i = 0; i < length; i++) {
if (valueChk == -1) {
System.out.println(0);
return;
}
if (OPEN_BRACKET.equals(inputArray[i]) || OPEN_SQUARE_BRACKET.equals(inputArray[i])) {
stringStack.push(inputArray[i]);
} else {
if (stringStack.isEmpty()) {
System.out.println(0);
return;
}
if (CLOSE_BRACKET.equals(inputArray[i])) {
if (OPEN_BRACKET.equals(stringStack.peek())) {
stringStack.pop();
stringStack.push(BRACKET_VALUE);
} else {
valueChk = loopInStack(stringStack, OPEN_SQUARE_BRACKET, OPEN_BRACKET, Integer.parseInt(BRACKET_VALUE));
}
} else {
if (OPEN_SQUARE_BRACKET.equals(stringStack.peek())) {
stringStack.pop();
stringStack.push(SQUARE_BRACKET_VALUE);
} else {
valueChk = loopInStack(stringStack, OPEN_BRACKET, OPEN_SQUARE_BRACKET, Integer.parseInt(SQUARE_BRACKET_VALUE));
}
}
}
}
while (!stringStack.isEmpty()) {
String peekValue = stringStack.peek();
if (OPEN_BRACKET.equals(peekValue) || OPEN_SQUARE_BRACKET.equals(peekValue)
|| CLOSE_BRACKET.equals(peekValue) || CLOSE_SQUARE_BRACKET.equals(peekValue)) {
System.out.println(0);
return;
}
ret += Integer.parseInt(stringStack.pop());
}
System.out.println(ret);
}
private static int loopInStack(Stack<String> stack, String s1, String s2, int value) {
int result = 0;
while (!stack.isEmpty()) {
String top = stack.peek();
if (s1.equals(top)) {
return -1;
} else if (s2.equals(top)) {
stack.pop();
result *= value;
stack.push(String.valueOf(result));
break;
} else {
result += Integer.parseInt(stack.pop());
}
}
return result;
}
}
@mingyu-lee
Copy link
Author

문제 풀이 소감 :
문제를 푸는 방법을 전혀 생각 못했다. 스택을 이용하는 방법은 검색을 통해서 힌트를 얻게 되었다.
그럼에도 어떻게 접근해야될지 몰랐는데, 사칙연산을 푸는 과정을 스택을 이용한다는 비상한 방법이 있었다는 것을 검색을 통해 알았다.

문제를 이해하고 어떻게 접근할 것이며, 그 접근 과정을 프로그래밍에 어떻게 접목시킬지 생각하는 것이 중요한 것 같다.
특히 알고리즘의 베이스가 되는 것이 수학이라고만 생각해서 수학적으로만 생각했는데, 자료구조에 대해서 아직 기본이 부족한 것 같다.

체감 난이도 :
어려움

어려웠던 점 :
문제 해결법 찾기

앞으로 필요할 것 같은 공부 :
문제 해결법 찾는 능력, 자료구조의 응용

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment