📍 문제 설명
https://programmers.co.kr/learn/courses/30/lessons/60058
코딩테스트 연습 - 괄호 변환
카카오에 신입 개발자로 입사한 "콘"은 선배 개발자로부터 개발역량 강화를 위해 다른 개발자가 작성한 소스 코드를 분석하여 문제점을 발견하고 수정하라는 업무 과제를 받았습니다. 소스를
programmers.co.kr
💡 접근
문제에서 요구하는 순서대로만 구현하면 되는 문제였다.
👩💻 코드
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner kb = new Scanner(System.in);
String p = kb.nextLine();
System.out.println(solution(p));
}
private static String solution(String p) {
//올바른 괄호 문자열은 '('의 갯수와 ')'의 갯수만 동일한 것
//균형잡힌 문자열은 poll 해야하는데 할게 없거나 사이즈가 남는 것
String answer = "";
if(p.equals("")) return answer;
String u = "";
String v = "";
int cnt = 0;
//문자열 분리
for(int i = 0; i < p.length(); i++) {
if(p.charAt(i) == '(') cnt++;
else cnt--;
//균형잡힌 괄호 문자열 찾았으면 바로 끝내!
if(cnt == 0) {
u = p.substring(0, i+1);
v = p.substring(i+1);
break;
}
}
//u가 올바른 괄호 문자열이면 v에 대해서 재귀적으로 다시 처리!
if(properString(u)) {
answer = u + solution(v);
}
//u가 올바른 괄호 문자열이 아니면 다른 처리!
else {
answer = "(";
//v에 대해서 재귀적으로 수행한 결과 붙이기
answer += solution(v);
answer += ")";
u = u.substring(1, u.length() - 1);
String temp = "";
for(int i = 0; i < u.length(); i++) {
if(u.charAt(i) == '(') temp += ")";
else temp += "(";
}
answer += temp;
}
return answer;
}
//올바른 괄호 문자열인지 판단
private static boolean properString(String p) {
Queue<Character> q = new LinkedList<>();
boolean flag = true;
for(int i = 0; i < p.length(); i++) {
//여는 괄호는 무조건 큐에 삽입
if(p.charAt(i) == '(') q.offer('(');
//닫는 괄호면 여는 괄호를 poll
else {
//poll시킬게 없으면 올바른 괄호 문자열이 아니다.
if(q.size() == 0) {
flag = false;
break;
}
q.poll();
}
}
if(q.size() == 0) return flag;
else return false;
}
}
'Algorithm > 이코테' 카테고리의 다른 글
| 20.감시 피하기 (0) | 2022.01.09 |
|---|---|
| 19.연산자 끼워넣기 (0) | 2022.01.09 |
| 17.경쟁적 전염 (0) | 2022.01.07 |
| 16.연구소 (0) | 2022.01.07 |
| 15.특정 거리의 도시 찾기 (0) | 2022.01.07 |