- 회고
84. 괄호 회전하기 : https://school.programmers.co.kr/learn/courses/30/lessons/76502
import java.util.*;
class Solution {
public int solution(String s) {
int answer = 0;
List<Character> open = Arrays.asList('(', '{', '[');
List<Character> close = Arrays.asList(')', '}', ']');
// s의 길이만큼 문자열을 회전
for (int i = 0; i < s.length(); i++) {
String rotated = s.substring(i) + s.substring(0, i);
if (isValid(rotated, open, close)) {
answer++;
}
}
return answer;
}
// 괄호의 짝이 올바른지 체크하는 함수
private static boolean isValid(String s, List<Character> open, List<Character> close) {
Stack<Character> stack = new Stack<>();
for (char c : s.toCharArray()) {
if (open.contains(c)) {
stack.push(c);
} else {
if (stack.isEmpty()) {
return false;
}
char lastOpen = stack.pop();
if (!isMatching(lastOpen, c, open, close)) {
return false;
}
}
}
return stack.isEmpty();
}
// 여는 괄호와 닫는 괄호가 짝이 맞는지 확인
private static boolean isMatching(char openChar, char closeChar, List<Character> open, List<Character> close) {
return open.indexOf(openChar) == close.indexOf(closeChar);
}
}
- 풀이과정 회고 : 괄호 회전 로직은 구현하였으나 상황에 따른 올바른 회전을 구하는 로직이 실패하는 케이스 발생
- substring을 통해 괄호 회전
- Stack를 사용하여 짝이 맞는지 체크
- 회전된 문자열을 순회하며 여는 괄호이면 stack에 push
- 닫는 괄호가나오면 stack를 pop하여 lastopen에 넣고 닫는괄호와 짝이 맞는지 비교
- 예를들어 (()(()())())의 경우에서 처음 앞에 (()가 나오게되면 1,2번째 인덱스를 비교한후 pop해서 다시 (..()..(()())()) ..사이를 제외하고 비교를 진행
- 회고 : 이러한 제거하면서 비교하는거에는 stack을 활용해야하는걸 알게됐다.
- 진행
일자 | 완료 번호 |
24.07.16 ~ 24.07.31 | 1~63 |
24.08.01 ~ 24.08.30 | 64~80 |
24.09.06 ~ 24.09.12 | 81 ~ 83 |
24.10.01 | 84 |
'Java & Spring > 코딩테스트' 카테고리의 다른 글
[백준] Java - 1929번 : 소수 구하기 (0) | 2024.12.10 |
---|---|
[백준] Java - 1018번 : 체스판 다시 칠하기 (1) | 2024.11.29 |
43일차 - 알고리즘 코드카타 (0) | 2024.09.12 |
42일차 - 알고리즘 코드카타 (0) | 2024.09.11 |
39일차 - 알고리즘 코드카타 (0) | 2024.09.06 |