Today's Codekata
import java.util.Stack;
class Solution {
public int solution(String s) {
int count = 0;
for (int i = 0; i < s.length(); i++) {
String rotated = s.substring(i) + s.substring(0, i);
Stack<Character> stack = new Stack<>();
boolean isValid = true;
for (char c : rotated.toCharArray()) {
if (c == '(' || c == '[' || c == '{') {
stack.push(c);
} else {
if (stack.isEmpty()) {
isValid = false;
break;
}
char open = stack.pop();
if ((c == ')' && open != '(') ||
(c == ']' && open != '[') ||
(c == '}' && open != '{')) {
isValid = false;
break;
}
}
}
if (isValid && stack.isEmpty()) {
count++;
}
}
return count;
}
}
오늘 풀어본 문제는 문자열을 일정 횟수만큼 왼쪽으로 돌려가며, 그 구조가 올바른지 판단하는 문제이다.
이 문제를 풀면서 가장 크게 배운 건 자바에서 제공하는 스택을 어떻게 활용하는 지였다.
스택은 가장 나중에 넣은 값을 가장 먼저 꺼내는 구조를 가지고 있어서, 열리는 기호가 나오면 스택에 넣고, 닫히는 기호가 나오면 스택에 가장 최근에 넣은 값을 꺼내서 짝이 맞는지 확인하는 방식이다.
처음에는 배열을 직접 만들어서 인덱스로 관리하려 했지만, 자바의 스택 클래스를 활용하니 훨씬 간결하고 직관적인 코드가 되었다.