코딩테스트/프로그래머스
[Java] 프로그래머스 - 괄호 변환 (2단계)
배똥회장
2022. 4. 28. 14:19
728x90
코딩 테스트 풀이 체크리스트 |
|
2시간 내에 풀었는가? | O |
본인의 실력으로 풀었는가? | O |
코딩테스트 연습 - 괄호 변환
카카오에 신입 개발자로 입사한 "콘"은 선배 개발자로부터 개발역량 강화를 위해 다른 개발자가 작성한 소스 코드를 분석하여 문제점을 발견하고 수정하라는 업무 과제를 받았습니다. 소스를
programmers.co.kr
import java.util.*;
class Solution {
public String solution(String p) {
return func(p); //func함수 자체가 String을 리턴하기 때문에 바로 리턴
}
public String func(String word) {
if (word.equals("")) return ""; //만약 빈 문자열이면 그대로 리턴함
//문자열을 붙이는 작업이 많기 때문에 시간 절약을 위해 StringBuilder 객체 선언하여 활용
StringBuilder result = new StringBuilder();
int position = 0; //u와 v를 구분하기 위한 위치를 담을 변수
int count = 0; //균형잡힌 문자열을 알아내기 위해서 사용하는 변수
String[] s = word.split("");
//올바른 문자열인지 아닌지를 구분하기 위한 변수
//만약 시작이 "("이면 올바른 문자열이고, 그렇지 않으면 아닌 것
boolean value = s[0].equals(")") ? false : true;
for (int i = 0; i < s.length; i++) {
count += (s[i].equals("(")) ? 1 : -1; //만약 s[i]가 "("면 +1을 아니면 -1을 함
if (count == 0) {
//괄호의 모양에 따라 +1 또는 -1 하면서 0이 되는 순간이 있음
//그 순간이 괄호 숫자가 딱 떨어지는 순간이기 때문에 여기서 잘라야 함
position = i + 1;
break;
}
}
String u = word.substring(0, position);
String v = word.substring(position, word.length());
if (value) { //올바른 문자열일 때
result.append(u);
result.append(func(v));
} else { //올바른 문자열이 아닐 때
result.append("(");
result.append(func(v)); //v는 다시 처음부터 반복해서 리턴해야 하기 때문에 함수 호출
result.append(")");
char[] uSplit = u.substring(1, u.length()-1).toCharArray(); //앞 뒤 제외하고 배열 만들기
for (int i = 0; i < uSplit.length; i++) { //괄호 뒤집기
uSplit[i] = uSplit[i] == '(' ? ')' : '(';
}
result.append(new String(uSplit));
}
return result.toString(); //리턴값이 String이기 때문에 toString() 필수
}
}
테스트 1 〉 | 통과 (0.21ms, 80.9MB) |
테스트 2 〉 | 통과 (0.14ms, 78.8MB) |
테스트 3 〉 | 통과 (0.11ms, 72.7MB) |
테스트 4 〉 | 통과 (0.20ms, 71MB) |
테스트 5 〉 | 통과 (0.22ms, 76.5MB) |
테스트 6 〉 | 통과 (0.16ms, 73.8MB) |
테스트 7 〉 | 통과 (0.29ms, 73.6MB) |
테스트 8 〉 | 통과 (0.20ms, 77MB) |
테스트 9 〉 | 통과 (0.32ms, 77.2MB) |
테스트 10 〉 | 통과 (0.26ms, 77.6MB) |
테스트 11 〉 | 통과 (0.80ms, 76.2MB) |
테스트 12 〉 | 통과 (1.38ms, 74.5MB) |
테스트 13 〉 | 통과 (1.96ms, 73.7MB) |
테스트 14 〉 | 통과 (3.80ms, 70.1MB) |
테스트 15 〉 | 통과 (3.40ms, 74.3MB) |
테스트 16 〉 | 통과 (12.50ms, 85.6MB) |
테스트 17 〉 | 통과 (5.09ms, 76.5MB) |
테스트 18 〉 | 통과 (11.14ms, 82.8MB) |
테스트 19 〉 | 통과 (21.54ms, 89.8MB) |
테스트 20 〉 | 통과 (20.80ms, 84.5MB) |
테스트 21 〉 | 통과 (5.69ms, 76MB) |
테스트 22 〉 | 통과 (4.01ms, 80.6MB) |
테스트 23 〉 | 통과 (41.25ms, 91.5MB) |
테스트 24 〉 | 통과 (4.12ms, 75.4MB) |
테스트 25 〉 | 통과 (9.37ms, 74.4MB) |
문제에서 재귀적으로 수행하라길래 진짜 재귀함수로 풀었음.
728x90