요르딩딩
프로그래머스 : 괄호변환 (String.CharAt(), 재귀) 본문
728x90
반응형
이번문제는 딱 문제를 읽었을때는 무슨소리야~~ 하면서 기분이 좋지 않았다ㅋㅋㅋㅋㅋ
그러나 이해하고 아래의 구현순서을 확인하니 감이 생겼고, 간단한 손코딩 후 바로 구현하기 시작했다.
구현순서가 자세히 나와있어, 구현하는데는 그다지 어렵지 않았던거 같다. 이 문제는 문제 이해가 핵심이다.
여기서 주요하게 생각하는 포인트를 알아보자.
1. String문자열은 CharAt을 이용하여 배열형태로 사용할 수 있다. (문자열.toCharArray()를 사용하면 바로 변환된다.)
2. 재귀를 사용한다. 재귀가 구현할때 고려해야할 부분들이 많아 어렵게 느껴지겠지만, 이 문제는 시키는대로만 구현하면 된다.
3. 추가로 괄호의 갯수 파악하기, 괄호 반대로 적용하기 등등 조금만 생각하면 쉽게 구현할 수 있다.
class Solution {
public String solution(String p) {
String answer = "";
String u="", v="";
if(p.isEmpty()) return "";
String[] arr = p.split("");
int leftCnt = 0, rightCnt = 0;
for(int i=0; i < arr.length; i++) {
String a = arr[i];
if("(".equals(a)) //왼쪽 괄호 수
leftCnt++;
else //오른쪽 괄호 수
rightCnt++;
if(leftCnt == rightCnt) { //균형잡힌 괄호 문자열일 경우 = u
u = p.substring(0, i+1);
v = p.substring(i+1, arr.length); //나머지 = v
break; //종료
}
}
if(this.rightCheck(u) == true ) { //u가 옳바은 괄호 문자열일 경우
answer += u;
String reV = this.solution(v); // v에 대해 1단계 부터 다시 시작
answer += reV;
}else {
String reV = this.solution(v); // v에 대해 1단계 부터 다시 시작
String tmpU ="";
if(u.length() > 2) {
tmpU = u.substring(1, u.length()-1); //앞뒤 자르기
}
String tmp = "";
for(int i=0; i < tmpU.length(); i++) {
if('(' == tmpU.charAt(i))
tmp +=")";
else
tmp +="(";
}
String tmpFinal = "(" + reV + ")" + tmp;
answer += tmpFinal; // 그대로인 값 뒤에붙인다.
}
return answer;
}
public boolean rightCheck(String k) { // 옳바른 괄호 문자열인지 판단
boolean result = false;
String[] arr = k.split("");
int cnt =0;
for(String a : arr) {
if("(".equals(a)) {
cnt++;
}else {
cnt--;
}
if(cnt <0) { //cnt가 음수인 순간 옳지 못한 괄호라고 판단
return false;
}
}
return true;
}
}
728x90
반응형
'[코딩테스트] > 문제풀이' 카테고리의 다른 글
프로그래머스 : 짝지어 제거하기 (stack) (0) | 2022.05.17 |
---|---|
프로그래머스 : 폰캣몬 (Set) (0) | 2022.05.16 |
프로그래머스 : 더 맵게 (우선순위 큐) (0) | 2022.05.13 |
프로그래머스 : [1차]비밀지도 (2진수, 비트연산) (0) | 2022.05.03 |
프로그래머스 : 실패율 (0) | 2022.04.25 |
Comments