프로그래머스 괄호변환 (Java,자바)
오늘 풀어본 문제는
프로그래머스 괄호변환 입니다.
📕 문제 링크
❗️코드
import java.util.*;
class Solution {
static StringBuilder sb;
public String solution(String p) {
if(p.equals("")) return "";
StringBuilder sb = new StringBuilder();
sb.append(make(p));
return sb.toString();
}
static String make(String str) // ))(( ()
{
if(str.length() == 0) return "";
String [] sep = separate(str);
String u = sep[0], v = sep[1]; // (()()) , ()
if(isCorrect(u))
{
return u + make(v);
}
else
{
StringBuilder tmp = new StringBuilder();
tmp.append("(").append(make(v)).append(")");
String tmpU = u.substring(1,u.length()-1);
tmpU = reverse(tmpU);
tmp.append(tmpU);
return tmp.toString();
}
}
static String [] separate(String str)
{
String [] arr = new String[2];
int left = 0, right = 0,end = 0;
for(int i = 0; i < str.length(); ++i)
{
String tmp = str.charAt(i)+"";
if(tmp.equals("(")) left++;
else right++;
if(left == right)
{
end = i;
break;
}
}
arr[0] = str.substring(0,end+1);
arr[1] = str.substring(end+1);
return arr;
}
static boolean isCorrect(String str)
{
if(str.length() ==0) return false;
int cnt = 0; //())
for(int i = 0; i < str.length(); ++i)
{
String tmp = str.charAt(i)+"";
if(tmp.equals("(")) cnt++;
else cnt--;
if(cnt < 0) return false;
}
return true;
}
static String reverse(String str)
{
StringBuilder sb = new StringBuilder();
for(int i = 0; i < str.length(); ++i)
{
String cur = str.charAt(i)+"";
if(cur.equals("(")) sb.append(")");
else sb.append("(");
}
return sb.toString();
}
}
📝 풀이
import java.util.*;
class Solution {
static StringBuilder sb;
public String solution(String p) {
if(p.equals("")) return "";
StringBuilder sb = new StringBuilder();
sb.append(make(p));
return sb.toString();
}
static String make(String str) // ))(( ()
{
if(str.length() == 0) return "";
String [] sep = separate(str);
String u = sep[0], v = sep[1]; // (()()) , ()
if(isCorrect(u))
{
return u + make(v);
}
else
{
StringBuilder tmp = new StringBuilder();
tmp.append("(").append(make(v)).append(")");
String tmpU = u.substring(1,u.length()-1);
tmpU = reverse(tmpU);
tmp.append(tmpU);
return tmp.toString();
}
}
static String [] separate(String str)
{
String [] arr = new String[2];
int left = 0, right = 0,end = 0;
for(int i = 0; i < str.length(); ++i)
{
String tmp = str.charAt(i)+"";
if(tmp.equals("(")) left++;
else right++;
if(left == right)
{
end = i;
break;
}
}
arr[0] = str.substring(0,end+1);
arr[1] = str.substring(end+1);
return arr;
}
static boolean isCorrect(String str)
{
if(str.length() ==0) return false;
int cnt = 0; //())
for(int i = 0; i < str.length(); ++i)
{
String tmp = str.charAt(i)+"";
if(tmp.equals("(")) cnt++;
else cnt--;
if(cnt < 0) return false;
}
return true;
}
static String reverse(String str)
{
StringBuilder sb = new StringBuilder();
for(int i = 0; i < str.length(); ++i)
{
String cur = str.charAt(i)+"";
if(cur.equals("(")) sb.append(")");
else sb.append("(");
}
return sb.toString();
}
}
📝 풀이
재귀를 사용하여 괄호를 올바르게 정리해주는 문제입니다.
먼저 문자열을 조건에 맞게 두개로 분리하고, u가 올바른 괄호 문자열인지 확인해줍니다.
문자열을 분리하는 separate함수에서 이미 양쪽 괄호 갯수가 맞게 정리된 문자열이므로,
u 문자열이 올바른지 확인하는 함수에서는 괄호가 열린만큼 닫힌지만 확인해주면 됩니다. 따라서 왼괄호 '(' 가 나왔을때는 카운트를 ++ , 오른괄호 ')' 일때는 카운트를 -- 해주고, 카운트값이 음수가 되는 순간 괄호가 열린 카운트보다 닫힌 카운트가 많아지는 상태이기때문에, 적합하지 않다고 판단할 수 있습니다. 오른괄호로 시작하는 문자열도 마찬가지로 시작하자마자 카운트가 -1이므로 false를 리턴하게 됩니다.
이렇게 u가 올바른 문자열인지 확인했으면, 여부에따라 u를 바로 StringBuilder에 합치거나, 주어진 조건에 맞게 u와 v를 재귀호출하여 문자열을 완성할 수 있습니다.
📜 후기
오늘도 코딩테스트를 대비하여 기출문제를 풀어보았습니다!
문제를 이해하는게 조금 힘들었지만, 주어진 조건 순서대로 그냥 짜다보니 해결되었습니다. 문제가 헷갈릴땐 시간 허비하지 말고 일단 짜봐야겠어요..ㅋㅋㅋㅋㅋ
Author And Source
이 문제에 관하여(프로그래머스 괄호변환 (Java,자바)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@jh5253/프로그래머스-괄호변환-Java자바저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)