[문제]
다음 규칙을 지키는 문자열을 올바른 괄호 문자열이라고 정의합니다.
- (), [], {} 는 모두 올바른 괄호 문자열입니다.
- 만약 A가 올바른 괄호 문자열이라면, (A), [A], {A} 도 올바른 괄호 문자열입니다. 예를 들어, [] 가 올바른 괄호 문자열이므로, ([]) 도 올바른 괄호 문자열입니다.
- 만약 A, B가 올바른 괄호 문자열이라면, AB 도 올바른 괄호 문자열입니다. 예를 들어, {} 와 ([]) 가 올바른 괄호 문자열이므로, {}([]) 도 올바른 괄호 문자열입니다.
대괄호, 중괄호, 그리고 소괄호로 이루어진 문자열 s가 매개변수로 주어집니다. 이 s를 왼쪽으로 x (0 ≤ x < (s의 길이)) 칸만큼 회전시켰을 때 s가 올바른 괄호 문자열이 되게 하는 x의 개수를 return 하도록 solution 함수를 완성해주세요.
[제한사항]
- s의 길이는 1 이상 1,000 이하입니다.
[내풀이]
import java.util.*;
class Solution {
public int solution(String s) {
int answer = 0;
char[] arr = s.toCharArray();
ArrayList<Character> al = new ArrayList<>();
for(char c : arr){
al.add(c);
}
for(int i=0; i<s.length(); i++){
if(check(al))answer++;;
al.add(al.get(0));//첫 요소를 받아와 맨 뒤에 추가
al.remove(0); //첫 요소 삭제;
}
return answer;
}
private static boolean check(ArrayList al){
if(al.get(0).equals(')') || al.get(0).equals(']') || al.get(0).equals('}')) return false; //첫 시작이 닫는 괄호이면 틀림
boolean answer = true;
Stack<Character>st = new Stack<>();
for(int i = 0; i <al.size(); i++){
char c = (Character)al.get(i);
if(c == '(' || c== '[' || c =='{') st.push(c);
else{
if(st.isEmpty()) return false;
switch(c){
case ')':
if(st.peek().equals('(')) st.pop();
break;
case ']':
if(st.peek().equals('[')) st.pop();
break;
case '}':
if(st.peek().equals('{')) st.pop();
break;
}
}
}
if(st.size()!=0) answer = false;
return answer;
}
}
[접근]
이 문제는 이전에 풀었던 올바른 괄호 문제의 응용이라고 생각한다.
문자열 회전은 ArrayList를 통해서 회전시켜주었고 올바른 괄호의 검증은 check메소드를 따로 만들어서 검증하였다.
다만 올바른 괄호문제와는 다르게 괄호의 종류가 3가지이기 때문에 닫는 괄호를 검사하는 부분에서 switch-case문을 활용하였다.
[JAVA , Lv2] 올바른 괄호
[문제] 괄호가 바르게 짝지어졌다는 것은 '(' 문자로 열렸으면 반드시 짝지어서 ')' 문자로 닫혀야 한다는 뜻입니다. 예를 들어 "()()" 또는 "(())()" 는 올바른 괄호입니다. ")()(" 또는 "(()(" 는 올바르
psh0036.tistory.com
'문제풀이 > 프로그래머스' 카테고리의 다른 글
[JAVA , Lv.2] 튜플 (0) | 2023.02.13 |
---|---|
[JAVA , Lv.2] 행렬의 곱셈 (0) | 2023.02.08 |
[JAVA , Lv.2] [1차] 캐시 (0) | 2023.02.05 |
[JAVA , Lv.2] H-Index (0) | 2023.02.05 |
[JAVA , Lv.2] 멀리 뛰기 (0) | 2023.02.05 |