import java.util.*;
class Solution {
boolean solution(String s) {
boolean answer = false;
int left = 0;
int right = 0;
String str = s;
String[] arr = str.split("");
for (int i = 0; i < arr.length; i++) {
if (arr[i].equals("(")) {
left += 1;
} else {
right += 1;
}
if (left < right) {
return false;
}
}
if (left == right) {
answer = true;
}
return answer;
}
}
우선 문자열을 잘라서 배열에 넣는 split() 메소드를 사용하여 반복문을 돌리는 방식으로 하였는데
이 방법을 사용하니까 시간 초과로 실패하게 된다.
그래서 찾아보니 문자열을 한 글자 씩 비교하게 해주는 메소드인 charAt()이 있었고 charAt으로 비교할 경우 split() 으로 배열을 만들어 비교하는 것 보다 속도, 성능이 더 좋다는 것을 알게 되었다
Stackoverflow charAt과 split 차이
String's split or charAt
charAt() 사용한 코드
import java.util.*;
class Solution {
boolean solution(String s) {
boolean answer = false;
int left = 0;
int right = 0;
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == '(') {
left += 1;
} else {
right += 1;
}
if (left < right) {
return false;
}
}
if (left == right){
answer = true;
}
return answer;
}
}
제출하면
정답 처리 된다.
아직은 큐, 스택이 익숙치 않아서 스택으로 푸는 방법도 알아보겠다.
import java.util.*;
class Solution {
boolean solution(String s) {
boolean answer = true;
Stack<Character> stack = new Stack<>();
for (int i = 0; i < s.length(); i++ ) {
if (s.charAt(i) == '(') {
stack.push('(');
} else {
if (stack.empty()) {
return false;
}
stack.pop();
}
}
answer = stack.empty();
return answer;
}
}
스택으로 푸는 방식은 ( 가 있다면 stack에 (를 추가해주고 (가 오지 않고 )가 먼저 온다면 false를 출력해주는 방식으로 풀면 된다.
나는 배열로 개수를 더해가면서 풀었는데 stack, queue 풀이를 볼 때면 항상 나와는 다른 생각에 놀란다.