문제
문제 풀이
입력되는 문자열 길이 `0 ~ s.length() - 1` 까지 한번 씩 자리이동을 하면서 이동을 했을 때의 상태의 문자가 올바른 문자인지 체크하는 문제이다.
기존에 비슷한 문제가 많은데, 여기서 여러번 더 반복하는 형식의 문제로 변환이 되었다.
나의 답안
public static int solution(String s) {
int answer = 0;
int len = s.length();
for (int i = 0; i < len; i++) {
Deque<Character> check = new LinkedList<>();
Deque<Character> deque = new LinkedList<>();
for (char c : s.toCharArray()) {
deque.offer(c);
}
int count = i;
while (count > 0) {
deque.offer(deque.poll());
count--;
}
boolean flag = true;
a:
while (!deque.isEmpty()) {
char cur = deque.poll();
if (check.isEmpty() && (cur == ')' || cur == ']' || cur == '}')){
flag = false;
break;
}
if (check.isEmpty()){
check.offer(cur);
continue;
}
if (cur == '(' || cur == '[' || cur == '{') {
check.offer(cur);
} else {
switch (cur) {
case ')':
if (check.peekLast() != '(') {
flag = false;
break a;
}
check.pollLast();
break;
case ']':
if (check.peekLast() != '[') {
flag = false;
break a;
}
check.pollLast();
break;
case '}':
if (check.peekLast() != '{') {
flag = false;
break a;
}
check.pollLast();
break;
}
}
}
if (flag && check.isEmpty()) answer++;
}
return answer;
}
다른 답안
import java.util.*;
class Solution {
public int solution(String s) {
int answer = 0;
int strLen = s.length();
for(int i = 0; i < strLen; i++)
answer += cal(s, i, strLen);
return answer;
}
public int cal(String s, int strtIdx, int strLen){
int ret = 0;
Stack<Character> st = new Stack<>();
for(int i = strtIdx; i < strtIdx + strLen; i++){
int idx = i % strLen;
char c = s.charAt(idx);
if(c == '(' || c == '{' || c == '[')
st.push(c);
else if(c == ')' || c == '}' || c == ']'){
if(st.empty())
return 0;
else if((st.peek() != '(' && c == ')') || (st.peek() != '{' && c == '}') || (st.peek() != '[' && c == ']'))
return 0;
else
st.pop();
}
}
if(!st.empty())
return 0;
return 1;
}
}