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 |