괄호를 다루는 문제입니다. 파라미터의 조건이 많아서 고려해줘야 할게 비교적 적어서 쉽게 풀 수 있었씁니다.
import java.util.Stack;
public class Solution {
public boolean isAlright(String s) {
Stack<Character> stack = new Stack<>();
for(int i = 0; i < s.length(); i++) {
if(!stack.isEmpty() && stack.peek() == '(' && s.charAt(i) == ')') stack.pop();
else stack.push(s.charAt(i));
}
return stack.isEmpty() == true ? true : false;
}
public String solution(String p) { // 인풋으로 항상 균형잡인 괄호 문자열이 들어온다.
String answer = "";
if(isAlright(p)) return p;
int lParen = 0;
int rParen = 0;
String u = "", v = "";
for(int i = 0; i < p.length(); i++) {
if(p.charAt(i) == '(') lParen++;
else rParen++;
if(lParen == rParen) {
u = p.substring(0, i + 1);
v = p.substring(i + 1);
break;
}
}
if(isAlright(u)) {
answer = u + solution(v);
}
else {
StringBuilder sb = new StringBuilder("(" + solution(v) + ")");
for(int i = 1; i < u.length() - 1; i++) sb.append(u.charAt(i) == '(' ? ')' : '(');
answer = sb.toString();
}
return answer;
}
}
문제에 나와있는 흐름 그대로 코드를 작성해주면 됩니다. 입력으로 들어오는 p가 항상 균형잡힌 괄호 문자열이기 때문에 올바른 괄호 문자열인지만 따로 체크해주면 됩니다.
올바른 괄호 문자열인지는 스택을 사용해서 체크해줬습니다. 하나씩 스택에 넣다가 스택의 top에 있는 친구와 새로 들어올 친구가 올바른 괄호 짝지라면 top에 있는 친구를 쏙 빼주면 올바른 괄호 문자열이라면 p의 길이만큼 다 돌면 스택에 아무것도 남아있지 않을겁니다.
입력으로 들어온 p가 올바른 괄호 문자열인지 체크해주고 그 밑에는 문제에서 하라는 대로 고오오오대로 짜면 됩니다.
감사합니다!.!
30분걸림
'Algorithm > Programmers' 카테고리의 다른 글
[2020 KAKAO BLIND RECRUITMENT][Trie] 가사 검색 - Java (0) | 2020.08.27 |
---|---|
[2020 KAKAO BLIND RECRUITMENT][시뮬레이션/완전 탐색] 자물쇠와 열쇠 - Java (0) | 2020.08.25 |
[2020 KAKAO BLIND RECRUITMENT][문자열 처리] 문자열 압축 - Java (0) | 2020.08.24 |
[2018 KAKAO BLIND RECRUITMENT][문자열 처리] [1차] 비밀지도 - Java (0) | 2020.08.15 |
[2017 카카오코드 예선][BFS] 카카오프렌즈 컬러링북 - Java (0) | 2020.08.15 |