반응형
코딩테스트 연습 - 괄호 변환
카카오에 신입 개발자로 입사한 콘은 선배 개발자로부터 개발역량 강화를 위해 다른 개발자가 작성한 소스 코드를 분석하여 문제점을 발견하고 수정하라는 업무 과제를 받았습니다. 소스를 컴�
programmers.co.kr
용어의 설명대로 재귀함수를 만들면 어렵지 않게 풀 수 있는 문제
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
|
public class 괄호변환 {
public String solution(String p) {
String answer = solve(p);
return answer;
}
// 문자열 반환을 위한 재귀함수
static String solve(String p) {
// 입력받은 문자열이 빈 문자열이거나 '올바른 괄호 문자열'이면 바로 return
if (p.isEmpty() || correct_paren(p))
return p;
String u = "", v = "";
int i = 0, cnt = 0;
for (; i < p.length(); i++) {
u += p.charAt(i);
cnt = p.charAt(i) == '(' ? cnt + 1 : cnt - 1;
// '균형잡힌 괄호 문자열'이 만들어지면 분리를 멈춘다.
if (cnt == 0) {
i++;
break;
}
}
if (i != p.length())
v = p.substring(i);
String answer = "";
String tmp = "";
if (correct_paren(u)) { // u가 올바른 괄호 문자열이면
tmp = solve(v); // v에 대해 1단계부터 다시 수행하고 (1)
answer += u + tmp; // u와 (1)의 결과를 이어 붙인다.
} else { // u가 올바른 괄호 문자열이 아니라면
tmp += "("; // 빈 문자열에 '('를 붙이고
tmp += solve(v); // v에 대해 1단계부터 재귀적으로 수행한 결과 문자열을 이어 붙이고
tmp += ")"; // ')'를 붙여준다.
// u의 첫 번째 문자와 마지막 문자를 제거하고
for (int j = 1; j < u.length() - 1; j++)
tmp += u.charAt(j) == '(' ? ")" : "("; // 나머지를 뒤집어서 뒤에 붙인다.
answer = tmp;
}
return answer;
}
// 올바른 괄호 문자열인가를 판단하는 함수
static boolean correct_paren(String p) {
int total = 0;
for (int i = 0; i < p.length(); i++) {
char tmp = p.charAt(i);
if (tmp == '(')
total--;
else
total++;
if (total > 0)
return false;
}
if (total == 0)
return true;
return false;
}
}
|
cs |
반응형
'Algorithm > Programmers' 카테고리의 다른 글
[Weekly Challenge] 2주차_상호평가 (python, swift) (0) | 2021.10.10 |
---|---|
[2019 KAKAO BLIND RECRUITMENT] 실패율(JAVA) (0) | 2020.09.11 |
[2019 KAKAO BLIND RECRUITMENT] 오픈채팅방(JAVA) (0) | 2020.09.11 |
[2020 KAKAO BLIND RECRUITMENT] 자물쇠와 열쇠 (JAVA) (2) | 2020.09.09 |
[2020 KAKAO BLIND RECRUITMENT] 문자열 압축 (JAVA) (0) | 2020.09.08 |
댓글