import java.util.Stack;
class Solution {
public int solution(String s) {
int answer = 0;
int n = s.length();
if (n == 1) {
return 0; // 길이가 1이면 올바른 괄호 문자열이 될 수 없음
}
for (int i = 0; i < n; i++) {
if (check(s, i)) {
answer++;
}
}
return answer;
}
// 특정 시작점으로 문자열 검사
static boolean check(String s, int start) {
Stack<Character> stack = new Stack<>();
int n = s.length();
for (int i = 0; i < n; i++) {
char ch = s.charAt((start + i) % n);
if (ch == '{' || ch == '(' || ch == '[') {
stack.push(ch);
} else {
if (stack.isEmpty()) {
return false;
}
char top = stack.pop();
if ((ch == '}' && top != '{') ||
(ch == ')' && top != '(') ||
(ch == ']' && top != '[')) {
return false;
}
}
}
return stack.isEmpty();
}
}
풀이
1. 문자열의 첫번째 값이 맨뒤로 이동해야된다.
2. 그리고 그 맨뒤로 이동한 스트링의 값을 확인해야된다.
3. 그것을 이제 시작점과 i번째의 나눈 나머지를 이용해서 이어 붙여 괄호를 비교해준다.
느낀점
자바에서는 String이 새 값을 쓸 때마다 새로운 메모리에 적용하는데, 처음에 생각한게 원초적으로 그냥 subString을 이용해서 첫번째 값을 직접 뒤로 이동시켰다. 그러다보니 값을 계속 새로운 메모리 적용해서 메모리 초과가 나왔다. 다음 생각해본 방법이 이제 이전에 풀었던 문제들에서 아이디어를 얻었는데 %을 이용한 탐색이다. 시작 문자기준해서 i++일 때 문자열의 길이만큼 반복하면 해당 문자열을 한번 탐색된다. 앞으로 이것을 많이 사용할 것 같다. java에서는 정말 String에 대한 것은 메모리를 생각하며 조심히 다뤄야겠다. 물론 stringBuilder를 이용해도 좋았을 것같다.
https://school.programmers.co.kr/learn/courses/30/lessons/76502
'Algorithm > Programmers' 카테고리의 다른 글
[JAVA] 프로그래머스 튜플 (0) | 2024.12.10 |
---|---|
[JAVA] 프로그래머스 [1차] 캐시 (1) | 2024.12.09 |
[JAVA] 프로그래머스 할인행사 (0) | 2024.12.04 |
[JAVA] 프로그래머스 연속 부분 수열 합의 개수 (0) | 2024.12.02 |
[JAVA] 프로그래머스 예상 대진표 (1) | 2024.11.30 |