🔗 문제 링크
[프로그래머스] 괄호 변환 / 2020 KAKAO BLIND RECRUITMENT
📝 풀이 과정
문제만 이해하면 그대로 구현하면 되는 문제이다.
() => 균형잡힌 괄호 문자열(O), 올바른 괄호 문자열(O)
)( => 균형잡힌 괄호 문자열(O), 올바른 괄호 문자열(X)
)(( => 균형잡힌 괄호 문자열(X), 올바른 괄호 문자열(X)
균형잡힌 괄호로 나눠주기 위해 '('는 +1, ')'는 -1로 계산하며 값이 0이 되면 균형잡힌 괄호로 판단하고 반복문을 탈출해주었다. 구해준 idx
로 문자열을 u와 v로 분할하고 u가 올바른 괄호 문자열인지 다시 한 번 판별한다. 이전과 같은 방식으로 진행하지만 진행하면서 음수가 나온다면 올바른 괄호가 아니므로 false를 반환하고 아니라면 true를 반환한다.
u가 올바른 괄호 문자열로 판단되면 u에 v를 올바른 괄호 문자열로 만들기 위해 다시 함수를 돌려 반환값을 붙여 반환한다. 아니라면 v의 앞뒤에 '(', ')'를 붙여주고, u의 앞뒤 문자를 제거하고 괄호의 방향을 뒤집어 붙인 결과를 반환한다.
💻 코드
class Solution {
public String solution(String p) {
return solve(p);
}
String solve(String s) {
if (s.length() == 0) return s;
int idx = 0, cnt = 0;
for (; idx < s.length(); idx++) {
cnt += s.charAt(idx) == '(' ? 1 : -1;
if (cnt == 0) break;
}
String u = s.substring(0, ++idx), v = solve(s.substring(idx));
if (check(u)) return u + v;
else
return "(" + v + ")" +
u.substring(1, u.length() - 1).chars()
.mapToObj(i -> i == '(' ? ')' : '(')
.collect(StringBuilder::new, StringBuilder::append, StringBuilder::append);
}
boolean check(String str) {
int cnt = 0;
for (char ch : str.toCharArray()) {
if (ch == '(') cnt++;
else if (--cnt < 0) return false;
}
return true;
}
}
'알고리즘 풀이 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 가사 검색 / 2020 KAKAO BLIND RECRUITMENT - JAVA (2) | 2021.04.06 |
---|---|
[프로그래머스] 자물쇠와 열쇠 / 2020 KAKAO BLIND RECRUITMENT - JAVA (0) | 2021.03.18 |
[프로그래머스] 문자열 압축 / 2020 KAKAO BLIND RECRUITMENT - JAVA (0) | 2021.03.09 |
[프로그래머스] 무지의 먹방 라이브 / 2019 KAKAO BLIND RECRUITMENT - JAVA (0) | 2021.03.09 |
[프로그래머스] 매칭점수 / 2019 KAKAO BLIND RECRUITMENT - JAVA (0) | 2021.03.01 |