예전에 풀었던 괄호 변환 문제와 비슷했지만 조금 더 복잡한 문제였다.
전체적인 문제 난이도는 쉬운 편이었던 것 같다.
제목이 괄호 회전이라 90도씩 돌리는줄 알았는데 왼쪽으로 한 칸씩 미는 문제였다.
문자열을 이동하는 메서드와 올바른 괄호인지 확인하는 메서드 2개로 로직을 짠뒤 한 번에 성공했다.
다만 코드가 쓸데없이 늘어나는것 같아서 풀면서도 마음이 불편했다.
그래서 괄호의 짝 세는 부분이 필요 없는 것 같아 지우고 리팩터링 했다.
실행 시간은 약간 더 빨리 지긴 했는데 거의 의미 없는 수준이다.
최초 코드
import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;
class Solution {
static int cnt;
public int solution(String s) {
int answer = 0;
cnt = 0;
// 올바른 괄호 검사 후 문자열 이동
for (int i = 0; i < s.length() - 1; i++) {
isCorrect(s);
s = move(s);
}
answer = cnt;
return answer;
}
// 문자열을 이동하는 메서드
static String move(String s) {
Queue<Character> queue = new LinkedList<>();
// Queue에 s 삽입
for (int i = 0; i < s.length(); i++) {
queue.add(s.charAt(i));
}
// 처음 문자 제거후 마지막에 추가
char ch = queue.poll();
queue.add(ch);
// StringBuilder로 String 만들고 반환
StringBuilder sb = new StringBuilder();
while (!queue.isEmpty()) {
sb.append(queue.poll());
}
return sb.toString();
}
// 올바른 괄호인지 확인하는 메서드
static void isCorrect(String s) {
Stack<Character> stack = new Stack<>();
// 괄호의 짝이 맞는지 확인
// 대괄호 cnt
int fCnt = 0;
// 중괄호 cnt
int sCnt = 0;
// 소괄호 cnt
int tCnt = 0;
for (int i = 0; i < s.length(); i++) {
switch (s.charAt(i)) {
case '[':
fCnt++;
break;
case ']':
fCnt--;
break;
case '(':
sCnt++;
break;
case ')':
sCnt--;
break;
case '{':
tCnt++;
break;
case '}':
tCnt--;
break;
}
}
// 짝이 맞는다면 Stack에 넣고 짝이 맞으면 제거
if (fCnt == 0 && sCnt == 0 && tCnt == 0) {
for (int i = 0; i < s.length(); i++) {
if(s.charAt(i) == '[') {
stack.push(s.charAt(i));
} else if((stack.contains('[')) && s.charAt(i) == ']') {
stack.pop();
} else if(s.charAt(i) == '(') {
stack.push(s.charAt(i));
} else if ((stack.contains('(')) && s.charAt(i) == ')') {
stack.pop();
} else if (s.charAt(i) == '{') {
stack.push(s.charAt(i));
} else if((stack.contains('{')) && s.charAt(i) == '}') {
stack.pop();
}
}
// Stack의 size가 0이면 조건 만족
if(stack.size() == 0) {
cnt++;
}
}
}
}
최종 코드
import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;
class Solution {
static int cnt;
public int solution(String s) {
int answer = 0;
cnt = 0;
// 올바른 괄호 검사 후 문자열 이동
for (int i = 0; i < s.length() - 1; i++) {
isCorrect(s);
s = move(s);
}
answer = cnt;
return answer;
}
// 문자열을 이동하는 메서드
static String move(String s) {
Queue<Character> queue = new LinkedList<>();
// Queue에 s 삽입
for (int i = 0; i < s.length(); i++) {
queue.add(s.charAt(i));
}
// 처음 문자 제거후 마지막에 추가
char ch = queue.poll();
queue.add(ch);
// StringBuilder로 String 만들고 반환
StringBuilder sb = new StringBuilder();
while (!queue.isEmpty()) {
sb.append(queue.poll());
}
return sb.toString();
}
// 올바른 괄호인지 확인하는 메서드
static void isCorrect(String s) {
Stack<Character> stack = new Stack<>();
for (int i = 0; i < s.length(); i++) {
if (stack.isEmpty()) {
stack.push(s.charAt(i));
} else {
if ((stack.contains('[')) && s.charAt(i) == ']') {
stack.pop();
} else if ((stack.contains('(')) && s.charAt(i) == ')') {
stack.pop();
} else if ((stack.contains('{')) && s.charAt(i) == '}') {
stack.pop();
} else {
stack.add(s.charAt(i));
}
}
}
// Stack의 size가 0이면 조건 만족
if (stack.size() == 0) {
cnt++;
}
}
}
'코딩 테스트' 카테고리의 다른 글
(Java) 프로그래머스 - 멀리뛰기 (0) | 2022.08.04 |
---|---|
(Java) 백준 5639 - 이진 검색 트리 (0) | 2022.08.02 |
(Java) 백준 11725 - 트리의 부모 찾기 (0) | 2022.08.01 |
(Java) 백준 9935 - 문자열 폭발 (0) | 2022.07.28 |
(Java) 백준 1991 - 트리 순회 (0) | 2022.07.28 |