https://school.programmers.co.kr/learn/courses/30/lessons/60058
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
푸는데 1시간 40분정도 걸린 것 같습니다.
기억해야할점들
첫번째. String.substring(startindex, endindex)를 잘 계산해야합니다.
abcde 라는 5글자 문자열이 있을떄,
abcde.substring(0,1); 이라하면 a
abcde.substring(1,5); 이라하면 bcde 입니다.
두번째. 올바른 괄호문자열이라면 그대로 return 한다는 문제조건을 안살폈습니다.
//올바른 괄호문자열이라면 그대로 return
import java.io.*;
import java.util.*;
class Solution {
public String solution(String p) {
String answer="";
answer = simulate(p);
return answer;
}
public static String simulate(String str){
// StringBuilder strbuilder = new StringBuilder(str);
//1.입력이 빈문자열일경우 빈문자열반환
if(str.length() == 0){
// answerStringBuilder.append("");
return "";
}
int openCnt = 0;
int closeCnt = 0;
boolean rightflag = true;
//이미 올바른 괄호 문자열인지 확인합니다.
for(int i=0;i<str.length();i++){
if(str.charAt(i) == '(') openCnt += 1;
else if(str.charAt(i) == ')') closeCnt += 1;
if(closeCnt > openCnt){
rightflag = false;
break;
}
}
if(openCnt == closeCnt && rightflag == true){
return str;
}
//2.문자열 w를 두 "균형잡힌 괄호 문자열" u,v로 분리.
openCnt = 0;
closeCnt = 0;
for(int i=0;i<str.length();i++){
if(str.charAt(i) == '(') openCnt +=1;
else if(str.charAt(i) == ')') closeCnt += 1;
//균형잡힌괄호문자열일떄
if(openCnt == closeCnt){
String u = str.substring(0,i+1);
String v = str.substring(i+1,str.length());
System.out.println("u:"+u+"v:"+v);
//3.문자열u가 올바른지 아닌지 판단하는코드 시작
openCnt = 0;
closeCnt = 0;
for(int j=0;j<u.length();j++){
if(u.charAt(j) == '('){ openCnt += 1;}
else if(u.charAt(j) == ')'){ closeCnt += 1; }
//4.문자열 u가 올바른 괄호 문자열이 아닐경우, 수행할것들 수행
//올바른 괄호문자열이 아닐경우(X)
if(closeCnt > openCnt){
StringBuilder empty = new StringBuilder();
StringBuilder uBuilder = new StringBuilder(u);
empty.append("(");
empty.append(simulate(v));
empty.append(")");
uBuilder.delete(0,1);
uBuilder.delete(uBuilder.length()-1,uBuilder.length());
for(int k=0;k<uBuilder.length();k++){
if(uBuilder.charAt(k) == '(') {empty.append(")");}
else if(uBuilder.charAt(k) == ')') {empty.append("(");}
}
u = uBuilder.toString();
// openCnt=0;
//closeCnt=0;
return empty.toString();
}
//3.문자열 u가 "올바른 괄호 문자열"이라면 문자열 v에 대해 1단계부터 다시 수행합니다.
//올바른 괄호 문자열이기에 여기까지온것임.
u += simulate(v);
return u;
}
}
}
return "";
}
}
두번쨰
import java.util.*;
class Solution {
String answer = "";
public String solution(String p) {
answer = simulate(p);
System.out.print(answer);
return answer;
}
String simulate(String w){
if(w.equals(""))
return "";
//2. 문자열 w를 두 "균형잡힌 괄호 문자열" u, v로 분리합니다. 단, u는 "균형잡힌 괄호 문자열"로 더 이상 분리할 수 없어야 하며, v는 빈 문자열이 될 수 있습니다.
int opencnt = 0;
int closecnt = 0;
String u="", v="";
for(int i=0;i<w.length();i++){
if(w.charAt(i) == '('){
opencnt+=1;
}else{
closecnt+=1;
}
if(opencnt == closecnt){
u = w.substring(0, i+1);
v = w.substring(i+1, w.length());
break;
}
}
System.out.print("u:"+u+"v:"+v);
//3. 문자열 u가 "올바른 괄호 문자열" 이라면 문자열 v에 대해 1단계부터 다시 수행합니다.
//3-1. 수행 한 결과 문자열을 u에 이어 붙인 후 반환합니다.
opencnt = 0;
closecnt = 0;
boolean flag = false;
for(int i=0;i<u.length();i++){
if(u.charAt(i) == '('){
opencnt+=1;
}else{
closecnt+=1;
}
if(closecnt > opencnt){
flag = true;
break;
}
}
//올바른 괄호 문자열이라면
if(flag == false){
u += simulate(v);
// System.out.println("right!");
}
//올바른 괄호 문자열이 아니라면
else if(flag == true){
String emptystr = "(";
emptystr += simulate(v);
emptystr += ")";
StringBuilder strbuilder = new StringBuilder();
strbuilder.append(u);
strbuilder.deleteCharAt(0);
strbuilder.deleteCharAt(strbuilder.length()-1);
System.out.println(strbuilder.toString());
for(int i=0;i<strbuilder.length();i++){
if(strbuilder.charAt(i) =='('){
emptystr += ")";
}else{
emptystr += "(";
}
}
return emptystr;
}
return u;
}
}
코드입니다.
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[카카오 기출 문제][3차] 파일명 정렬 - 레벨 2,구현 + 문자열 (0) | 2022.10.23 |
---|---|
[카카오 기출 문제] 오픈채팅방 - 레벨 2,구현 + 문자열 (0) | 2022.10.07 |
[카카오 기출 문제] 크레인 인형뽑기 - 레벨 1, 구현 (0) | 2022.09.05 |
[카카오 기출 문제] 키패드 누르기 - 레벨 1, 구현 + 문자열 (0) | 2022.09.05 |
[카카오 기출 문제] 숫자 문자열과 영단어 - 레벨 1, 구현 + 문자열 (0) | 2022.09.04 |