[문제]
출처 - https://programmers.co.kr/learn/courses/30/lessons/60058?language=java
[문제 풀기 전]
이 문제에 처음 접근할 때 2번 u, v 를 나누는 처리와 재귀의 처리가 좀 까다로웠다. 재귀는 그냥 진짜 문제에서 하라는대로 반환(return) 하면 되는 것이였고.. u,v 를 나눌 때 따로 ' ( ' 와 ' ) ' 개수가 같아질 때는 생각했는데 문자열을 나누고 만드는 부분이 미숙하였다. 카카오 문제를 풀면서 느낀건 내가 아직 문자열 문제에 많이 취약하다는 것을 느꼈다.
[문제 풀이]
구현력을 요구하는 문제로서 문제에 나와있는대로 따라가면서 코드를 작성하면 된다.
두 균형잡힌 괄호 문자열 u, v 로 분리해야 하는데 u 는 `균형잡힌 괄호 문자열`로 더 이상 분리 할 수 없어야 한다.
즉, ' ( ' 의 개수와 ' ) ' 의 개수가 처음으로 같아 질때 분리해야한다. 분리하기 위해서는 분리할 포인트를 가지고 있어야 하기 때문에 u 가 만들어 지점에서 위치를 멤버 변수에 저장하도록 구현한다.
위치 값과 올바른 괄호 문자열을 판단하는 메서드를 만드는데 반환값의 힌트는 3번 과 4번에서 확인 할 수 있다.
`올바른 괄호 문자열` 일때와 아닐 때의 과정으로 나누어져 있어 문제에서 주어진 문자열을 u, v 로 분리하기 전 스택을 활용하여 '올바른 괄호 문자열 인지 판단' 하여 True / False 반환한다.
나머지는 주어진대로 구현을 하면 됩니다.
소스코드를 참고하시면 됩니다!
[소스 코드]
import java.util.*;
class Solution {
int pos;
public String solution(String p) {
//1번
if(p.isEmpty()){
return p;
}
//2번
boolean isBalance = balanceString(p);
String u = p.substring(0, pos);
String v = p.substring(pos, p.length());
//3번
if(isBalance){
//3-1
return u + solution(v);
}else{
//4번
//4-1
String answer = "(";
//4-2
answer += solution(v);
//4-3
answer += ')';
//4-4
for (int i = 1; i < u.length() - 1; i++) {
if (u.charAt(i) == '(') {
answer += ")";
}else{
answer += "(";
}
}
return answer;
}
}
public boolean balanceString(String s) {
Stack<Character> stack = new Stack<>();
boolean checkBalance = true;
int left = 0;
int right = 0;
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == '(') {
left++;
stack.push('(');
}else{
right++;
if (stack.isEmpty()) {
checkBalance = false;
}else {
stack.pop();
}
}
if (left == right) {
pos = i + 1; // u 와 v 자르는 지점 , u 의 끝 , v 의 시작
return checkBalance;
}
}
return true;
}
}
'프로그래머스' 카테고리의 다른 글
[프로그래머스 Level2] 순위 검색(JAVA) - 2021 카카오 (0) | 2022.03.30 |
---|---|
[프로그래머스 Level1] 숫자 문자열과 영단어(JAVA) - 2021 Kakao (0) | 2022.03.13 |
[프로그래머스 Level2] 문자열 압축 (JAVA) - 2020 Kakao (0) | 2022.02.01 |
[프로그래머스 Level3] - 디스크 컨트롤러 (JAVA) (1) | 2022.01.17 |
[프로그래머스 Level2] 더 맵게 (JAVA) (0) | 2022.01.12 |