Algorithm
[Programmers Level 2] 올바른 괄호
Sue
2022. 8. 15. 01:26
문제
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
첫번째 시도
넘어온 괄호 문자열을 split으로 자른 후, 열린 괄호일 경우 스택에 push, 닫는 괄호일 경우 pop해서 스택이 비어있는지 여부를 반환하는 방법으로 시도했다.
import java.util.*;
class Solution {
boolean solution(String s) {
String[] temp = s.split("");
Stack<String> stack = new Stack<>();
// 닫는 괄호로 시작하거나 여는 괄호로 끝나면 false 반환
if (temp[0].equals(")") || temp[temp.length-1].equals("(")) {
return false;
}
for (int i = 0 ; i < temp.length ; i ++) {
if (temp[i].equals("(")) { // 여는 괄호일 경우 stack에 push
stack.push(temp[i]);
} else { // 닫는 괄호일 경우 pop
if (stack.isEmpty()) {
return false;
}
stack.pop();
}
}
return stack.isEmpty();
}
결과
효율성 점수 빵점..
두번째 시도
split 하는 과정을 생략하고 String의 charAt 메서드를 사용해서 괄호를 비교하는 방법을 사용했다. split 메서드 실행 시 문자열을 분리하고, 배열에 삽입하는 과정까지 들어가기 때문에 시간복잡도는 O(n^2)이 되어서 그런 것 같다!
그리고 for문에 들어가기 전 문자열 맨 앞의 괄호가 닫힌 괄호일 경우, 문자열 맨 뒤의 괄호가 열린 괄호일 경우 바로 false를 리턴하는 방법이 효율성을 높여줄 줄 알았는데 아니었다..^^ 비교 해보니까 효율성 테스트 시간에 + 3 ~ 4ms 로 나와서 해당 코드는 제거했다.
import java.util.*;
class Solution {
boolean solution(String s) {
// split으로 String 배열 사용 시 효율성 0점 > charAt() 사용
Stack<Character> stack = new Stack<>();
for (int i = 0 ; i < s.length() ; i ++) {
if (s.charAt(i) == '(') { // 여는 괄호일 경우 stack에 push
stack.push(s.charAt(i));
} else { // 닫는 괄호일 경우 pop
if (stack.isEmpty()) { // stack에 열린 괄호가 없으면 바로 false 반환
return false;
}
stack.pop();
}
}
return stack.isEmpty();
}
}