문제
https://school.programmers.co.kr/learn/courses/30/lessons/60058
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
풀이
- 빈 문자열이면 그대로 반환.
- p를 균형잡힌 괄호 문자열 u와 v로 분리.
- u가 올바른 괄호 문자열이면, v를 재귀적으로 변환 후 u + solution(v) 반환.
- u가 올바른 문자열이 아니라면
- ( 를 추가하고 solution(v) 결과를 붙이고 ) 추가.
- u의 앞뒤 문자를 제거하고 괄호 방향을 반대로 변환하여 붙임.
- 변환된 문자열을 반환.
class Solution {
// 균형잡힌 문자열의 인덱스 반환
public int balancedIndex(String p) {
int count = 0; // 왼쪽 괄호 개수
for (int i = 0; i < p.length(); i++) {
if(p.charAt(i) == '(') count += 1;
else count -= 1;
if(count == 0) return i;
// '('와 ')'의 개수가 같아지면 균형잡힌 부분 문자열(u)의 끝 인덱스를 반환
}
return -1;
}
// 올바른 괄호 문자열인지 판단
public boolean checkProper(String p) {
int count = 0; // 왼쪽 괄호 개수
for (int i = 0; i < p.length(); i++) {
if(p.charAt(i) == '(') count += 1;
else {
if(count == 0) { // 쌍이 맞지 않는 경우
return false;
}
count -= 1;
}
}
return true; // 쌍이 맞는 경우
}
public String solution(String p) {
String answer = "";
// 1. 입력이 빈 문자열이면 그대로 반환
if(p.isEmpty()) return answer;
// 2. 문자열을 균형잡힌 두 개의 부분 문자열 u, v로 분리
int index = balancedIndex(p);
String u = p.substring(0, index + 1);
String v = p.substring(index + 1);
// 3. u가 올바른 괄호 문자열이라면
if (checkProper(u)) {
// v에 대해 solution을 재귀적으로 수행하여 결과를 붙여 반환
answer = u + solution(v);
}
// 4. u가 올바른 괄호 문자열이 아니라면
else {
answer = "("; // 4-1. 빈 문자열에 '(' 추가
answer += solution(v); // 4-2. v를 solution 함수로 변환한 결과를 추가
answer += ")"; // 4-3. ')' 추가
// 4-4. u의 첫 번째와 마지막 문자를 제거하고 나머지 괄호 방향을 뒤집음
u = u.substring(1, u.length() - 1); // 첫 번째와 마지막 문자를 제거
StringBuilder temp = new StringBuilder();
for (int i = 0; i < u.length(); i++) {
// '('이면 ')'으로, ')'이면 '('으로 변환
if(u.charAt(i) == '(') temp.append(")");
else temp.append("(");
}
answer += temp; // 변환한 문자열을 뒤에 추가
}
// 4-5. 생성된 문자열 반환
return answer;
}
}
'알고리즘' 카테고리의 다른 글
[백준] 감시 피하기 (0) | 2025.02.27 |
---|---|
[백준] 연산자 끼워넣기 (0) | 2025.02.25 |
[백준] 경쟁적 전염 (0) | 2025.02.24 |
[백준] 연구소 (0) | 2025.02.24 |
[백준] 특정 거리의 도시 찾기 (0) | 2025.02.24 |