문제 설명
접근 방법
파라미터로 입력받은 괄호 문자열을 문제에서 주어진 방식대로 변환시켜주면 됩니다.
우선 첫 번째 조건에 따르면 입력(String p)이 빈 문자열인 경우, 단순히 빈 문자열을 반환하기만 하면됩니다.
if (p.isEmpty()) return p;
그렇지 않을 경우 해당 문자열(반드시 균형잡힌 괄호 문자열)을 두 개의 문자열로 분리하는데 이 중 하나는 더 이상 분리될 수 없는 균형잡힌 괄호 문자열, 나머지 하나는 이외 나머지의 문자열로 빈 문자열이 될 수도 있습니다. 그리하여 해당 문자열을 문자(char)형 배열로 변환 후 첫 번째로 발견되는 균형잡힌 괄호 문자열(u)과 이외 나머지 문자열(v)을 추출하여 2개의 문자열 배열로 반환하도록 했습니다.
private String[] splitBracket(String p) {
String[] result = new String[]{"", ""};
char[] brackets = p.toCharArray();
int count = 0;
for (int i = 0; i < brackets.length; i++) {
if (brackets[i] == '(') {
count++;
result[0] += "(";
}
else {
count --;
result[0] += ")";
}
if (count == 0) {
if (i != brackets.length - 1)
result[1] = p.substring(i + 1);
break;
}
}
return result;
}
다음으로 첫 번째 문자열(u)이 올바른 괄호 문자열인지를 검증하도록 했습니다. 이때 검증 방식은 문자열의 각 문자를 순회할 때 ')'가 더 많아지는 경우(항상 올바르지 않은 괄호 문자열)를 체크(check)하여 올바른지를 검증했습니다.
private boolean verify(String p) {
char[] chars = p.toCharArray();
int count = 0;
for (char aChar : chars) {
if (aChar == '(')
count++;
else
count--;
if (count < 0) {
return false;
}
}
return true;
}
이때 올바르다면 두 번째 문자열(v)에 대해 앞선 작업들을 반복하여 얻은 문자열을 첫 번째 문자열(u) 뒤에 붙여 반환하도록 했습니다. 만일 올바르지 않다면 '('와 ')' 사이에 두 번째 문자열(v)에 대해 앞선 작업들을 반복하여 얻은 문자열을 붙이고 맨 뒤에 첫 번째 문자열(u)의 앞뒤 문자 제거 및 뒤집기에 대한 결과를 붙여 반환하도록 합니다. 이때 문자열의 앞뒤 문자 제거 및 뒤집기 처리는 다음과 같이 구현했습니다.
private String reverseString(String p) {
String temp = p.substring(1, p.length() - 1);
StringBuilder sb = new StringBuilder();
char[] chars = temp.toCharArray();
for (char c : chars) {
if (c == '(') {
sb.append(')');
} else {
sb.append('(');
}
}
return sb.toString();
}
전체 소스 코드
class Solution {
public String solution(String p) {
if (p.isEmpty()) return p;
String[] result = splitBracket(p);
if (verify(result[0])) {
return result[0] += solution(result[1]);
}
else {
return "(" + solution(result[1]) + ")" + reverseString(result[0]);
}
}
private String[] splitBracket(String p) {
String[] result = new String[]{"", ""};
char[] brackets = p.toCharArray();
int count = 0;
for (int i = 0; i < brackets.length; i++) {
if (brackets[i] == '(') {
count++;
result[0] += "(";
}
else {
count --;
result[0] += ")";
}
if (count == 0) {
if (i != brackets.length - 1)
result[1] = p.substring(i + 1);
break;
}
}
return result;
}
private boolean verify(String p) {
char[] chars = p.toCharArray();
int count = 0;
for (char aChar : chars) {
if (aChar == '(')
count++;
else
count--;
if (count < 0) {
return false;
}
}
return true;
}
private String reverseString(String p) {
String temp = p.substring(1, p.length() - 1);
StringBuilder sb = new StringBuilder();
char[] chars = temp.toCharArray();
for (char c : chars) {
if (c == '(') {
sb.append(')');
} else {
sb.append('(');
}
}
return sb.toString();
}
}
참고자료
'Algorithm > Programmers' 카테고리의 다른 글
[프로그래머스] 구명보트 - Java (0) | 2022.05.29 |
---|---|
[프로그래머스] 다리를 지나는 트럭 - Java (0) | 2022.05.21 |
[프로그래머스] 프린터 - Java (0) | 2022.05.17 |
[프로그래머스] 빛의 경로 사이클 - Java (0) | 2022.05.16 |
[프로그래머스] 카펫 - Java (0) | 2022.05.11 |