📘요구 사항 정리
- (), [], {} 는 모두 올바른 괄호 문자열입니다.
- 만약 A가 올바른 괄호 문자열이라면, (A), [A], {A} 도 올바른 괄호 문자열입니다.
- 예를 들어, [] 가 올바른 괄호 문자열이므로, ([]) 도 올바른 괄호 문자열입니다.
- 만약 A, B가 올바른 괄호 문자열이라면, AB 도 올바른 괄호 문자열입니다.
- 예를 들어, {} 와 ([]) 가 올바른 괄호 문자열이므로, {}([]) 도 올바른 괄호 문자열입니다.
📌 제약 조건
📌 구현코드
package pra.lv2.괄호회전하기;
import java.util.Stack;
public class answer_1 {
public static void main(String[] args) {
int result = solution("[](){}");
System.out.println(result);
}
//(), [], {} 는 올바른
public static int solution(String s) {
boolean valid = true;
int count =0;
for(int i=0;i<s.length();i++){
result = true;
Stack<Character> chatList = new Stack<>();
for(int j=0;j<s.length();j++){
//j가 어디서부터 시작하는지 정해주고
//i가 회전 수를 나타내는 것이기 때문에
//i+j %s.length를 한다면 회전 후 해당되는 위치의 값을 구할 수 있다.
char data = s.charAt((i+j)%s.length());
if(data==('(')||data==('[')||data==('{')){
chatList.push(data);
}else{
if(chatList.empty()){
valid = false;
break;
}
char peekData = chatList.peek();
if(peekData==('(')&&data==(')') ||
peekData==('[')&&data==(']')||
peekData==('{')&&data==('}')){
chatList.pop();
}
}
}
if (chatList.empty()&&valid ==true){
count++;
}
}
return count;
}
}
📌 구현코드 해설
- 스택을 공부하고 다시보니 훨씬 수월하게 풀었다.
- for문 첫번째 i는 회전수 이다.
- for문 두번째 j는 문자열 개수만큼 for문을 돌린다.
- char data = s.charAt((i+j)%s.length());
- 회전수 + 문자열 개수를 하고 s.length를 하게 되면 회전 된 값 만큼 추가 돼서
- 회전된 값 부터 for문이 시작하게 된다.
- 만약 여는 괄호를 만나면 Stack에 값을 넣어주고
- 닫는 괄호를 만날때 Stack이 비어있다면
- valid를 false로 만들고
- 즉시 for문을 종료한다.
- 닫는 괄호를 만나고 Stack이 비어있지 않다면
- Stack 의 peek을 사용하여 마지막으로 들어가져 있는 값을 들고 온다.
- peek한 값과, 현재 닫는괄호를 비교해서 알맞다면 pop을 해준다
- 2번째 for문을 종료한 후 valid가 true이고, stack도 비어 있다면 count++를 해준다.