- stack의 구조 이해하기
- Scanner로 문자열 입력
- 입력받은 문자열의 길이만큼 반복문 실행하기
- 조건문으로 pop/push/결과값 연산 다루기
//1. Stack 클래스 선언 방법 Stack<String> stack = new Stack<>(); //2. Scannner은 char타입으로 입력받을 수 없다. 따라서 String 타입으로 입력받고 이를 CharAt으로 변환해야 한다. // 저장된 문자열 중에서 한 글자만 선택해서 char타입으로 변환해주는 메소드 // index : 문자열의 순서값 (0~n번째) CharAt(index);
// 오류 코드
package algorithm;
import java.util.Scanner;
import java.util.Stack;
public class Problem_Stack_10799 {
public static void main(String[] args) {
Stack<Character> stack = new Stack<Character>();
Scanner key = new Scanner(System.in);
String str = key.next();
int size = str.length();
int result = 0;
for(int i=0; i<=size;i++) { //for문이 0~size번 돌고있어서 오류
if(str.charAt(i)=='(') { //오류 발생 지점
stack.push('(');
}else {
stack.pop();
if(str.charAt(i-1)=='(') {
result = result+stack.size();
}else {
result++;
}
}
}
System.err.println(result);
}
}
=> 자바에서의 문자열의 길이는 0번부터 n-1이기 때문에 위 조건에서 size번째에 해당하는 문자열은 존재하지 않는다. 존재하지 않는 size번째 문자열의 조건을 수행할 수 없기 때문에 해당 오류가 일어났다. 따라서 int i=0; i<size; i++ 로 수정하여 오류를 해결할 수 있었던 것이다.
package algorithm;
import java.util.Scanner;
import java.util.Stack;
public class Problem_Stack_10799 {
public static void main(String[] args) {
Stack<Character> stack = new Stack<Character>();
Scanner key = new Scanner(System.in);
String str = key.next();
int size = str.length();
int result = 0;
for(int i=0; i<size;i++) {
if(str.charAt(i)=='(') {
stack.push('(');
}else {
stack.pop();
if(str.charAt(i-1)=='(') {
result = result+stack.size();
}else {
result++;
}
}
}
System.err.println(result);
}
}
API를 잘 알고 있어야겠다. 틈틈히 오라클 API 들어가서 자주 쓰는 클래스들을 읽어놓자.