반응형
문제 정보는 아래 링크를 확인해주세요!
[괄호 변환]
문제 접근 방법
- 제공 받은 문자열을 기준으로 u와 v를 만들어준다.
- v 문자열을 다시 u와 v로 만들고 v가 빈 문자열이 될 때까지 반복한다.(재귀를 통해 진행)
- v가 빈 문자열이 되었을 때, u에 대해서 올바른 괄호 문자열인지 검사하고,
- u와 v에 대한 올바른 괄호 문자열을 만들어준다.
- 이 과정이 진행되면서 결국 마지막에는 처음 u와 v가 만들어졌던 로직으로 돌아오게 되는데,
- 이 때의 올바른 괄호 문자열인 v와 u에 대해서 마지막으로 검사를 하고,
- 이 둘을 합쳐서 반환한다.
[소스 코드]
package algorithm.kakao;
import java.util.*;
/*
* 2020 카카오 블라인드 코딩테스트
* 괄호 변환
* */
public class Pro60058 {
public String solution(String p) {
StringBuilder sb = solve(p);
return sb.toString();
}
private StringBuilder solve(String str) {
StringBuilder u = new StringBuilder("");
StringBuilder v = new StringBuilder("");
int open = 0;//여는 괄호
int close = 0;//닫는 괄호
//u와 v를 생성
for (int i = 0; i < str.length(); i++) {
if (str.charAt(i) == '(') open++;
else close++;
if (open == close) {//괄호의 갯수가 같아지는 지점이 u와 v를 나누는 기준
u.append(str.substring(0,i+1));
v.append(str.substring(i+1));
break;
}
}
//v에 대해서 재귀를 통해 괄호 검사
if (!"".equals(v.toString())) v = solve(v.toString());
StringBuilder sb = new StringBuilder("");
//올바르지 않은 문자열일 때,
if (!isCorrect(u)) {
//v의 앞,뒤로 괄호 추가
sb.append("("+v.toString()+")");
//u의 앞,뒤를 제거하고 모든 괄호를 뒤집어주고 v에 붙여준다.
for (int i = 1; i < u.length()-1; i++) {
if (u.charAt(i) == '(') sb.append(")");
else sb.append("(");
}
}else {//올바른 괄호일 때
//u에 뒤에 v를 붙여준다.
sb.append(u.toString()+v.toString());
}
return sb;
}
//올바른 괄호 체크
private boolean isCorrect(StringBuilder u) {
//첫 번째와 마지막이 쌍을 이루는지 체크
return u.charAt(0) == '(' && u.charAt(u.length()-1) == ')';
}
}
[정확성 테스트]
반응형
LIST
'알고리즘 > 연습문제' 카테고리의 다른 글
2020 카카오 블라인드 코딩테스트 - 가사 검색 (feat. Java) (0) | 2020.05.20 |
---|---|
2020 카카오 블라인드 코딩테스트 - 자물쇠와 열쇠 (feat. Java) (0) | 2020.05.19 |
2020 카카오 블라인드 코딩테스트 - 문자열 압축 (feat. Java) (0) | 2020.05.19 |
2019 카카오 블라인드 코딩테스트 - 블록 게임 (feat. Java) (0) | 2020.05.17 |
2019 카카오 블라인드 코딩테스트 - 매칭 점수 (fea. Java) (0) | 2020.05.16 |