티스토리 뷰
programmers.co.kr/learn/courses/30/lessons/60058?language=java
public static String solution(String p) {
if("".equals(p)) {
return p;
}
String u = "";
String v = "";
StringBuilder builder = new StringBuilder();
char startBracket = p.charAt(0);
int bracketCnt = 0;
boolean isCorrectWord = startBracket == '(';
for(int i = 0; i < p.length(); i++) {
bracketCnt = startBracket == p.charAt(i) ? bracketCnt + 1 : bracketCnt - 1;
if(bracketCnt < 0) {
u = p.substring(0, i);
v = p.substring(i, p.length());
break;
}
}
if(isCorrectWord) {
if("".equals(v)) {
return p;
} else {
builder.append(u);
builder.append(solution(v));
}
} else {
builder.append("(");
builder.append(solution(v));
builder.append(")");
if(u.length() > 0) {
String tempStr = u.substring(1,u.length()-1);
int index = 0;
StringBuilder tempBuilder = new StringBuilder(u.substring(1,u.length()-1));
if(tempStr.charAt(0) == ')') {
for(int i = 0; i < tempStr.length(); i++) {
if(tempStr.charAt(i) == '(') {
index = i;
}
}
tempStr = tempStr.substring(index, tempStr.length());
for(int i = 0; i < index; i++) {
tempStr += ")";
}
}
if(tempBuilder.charAt(0) == ')') {
tempBuilder.reverse();
}
builder.append(tempStr);
}
}
return builder.toString();
}
처음 생각한 코드는 이렇다
테스트는 통과했지만 채점에서 죽죽 붉은줄이 뜬다...
여기저기 구글링을 해본 결과
4-4. u의 첫 번째와 마지막 문자를 제거하고, 나머지 문자열의 괄호 방향을 뒤집어서 뒤에 붙입니다.
요문장에서 reverse로 하면 12번부터 주르륵 틀린다고 나올거란거다
문장 그대로 뒤집어서 뒤에 붙여야한다
그리고 올바른 문장을 확인하는 부분이 너무 부실해서 이것도 문자열 u에 대해 확인하는 메소드로 수정했다.
public String solution(String p) {
if("".equals(p)) {
return "";
}
String u = "";
String v = "";
StringBuilder builder = new StringBuilder();
char startBracket = p.charAt(0);
int bracketCnt = 0;
for(int i = 0; i < p.length(); i++) {
bracketCnt = startBracket == p.charAt(i) ? bracketCnt + 1 : bracketCnt - 1;
if(bracketCnt == 0) {
u = p.substring(0, i+1);
v = p.substring(i+1, p.length());
break;
}
}
if(isCorrect(u)) {
builder.append(u);
builder.append(solution(v));
} else {
builder.append("(");
builder.append(solution(v));
builder.append(")");
String tempStr = u.substring(1,u.length()-1);
tempStr = reverse(tempStr);
builder.append(tempStr);
}
return builder.toString();
}
private static boolean isCorrect (String str) {
int bracketCnt = 0;
for(int i = 0; i < str.length(); i++) {
bracketCnt = str.charAt(i) == '(' ? bracketCnt + 1 : bracketCnt - 1;
if(bracketCnt < 0) return false;
}
return true;
}
private static String reverse (String str) {
StringBuilder builder = new StringBuilder();
for(int i = 0; i < str.length(); i++) {
if(str.charAt(i) == ')') {
builder.append('(');
} else {
builder.append(')');
}
}
return builder.toString();
}
ps. )()()()( <- 요 테스트를 추가해서 디버깅해본게 나름 도움이 되었다.
'기초CS > 알고리즘' 카테고리의 다른 글
[프로그래머스] 알고리즘 연습 문제 : 카펫(자바/JAVA) (0) | 2020.12.16 |
---|---|
[프로그래머스] 알고리즘 연습 문제 : 키패드 누르기(자바/JAVA) (0) | 2020.12.06 |
[프로그래머스] 알고리즘 연습 문제 : 주식가격 (자바/JAVA) (0) | 2019.12.01 |
[프로그래머스] 알고리즘 연습 문제 : 프린터 (자바/JAVA) (0) | 2019.11.28 |
[프로그래머스] 알고리즘 연습 문제 : 타겟 넘버 (자바/JAVA) (0) | 2019.09.07 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 객체지향과 디자인패턴
- cgv
- json
- API
- K번째수
- 쇠막대기
- 124 나라의 숫자
- AWS
- 예매 알림
- 맵 api
- 자바
- 파이팅코리아
- 스프링 부트
- 기능개발
- FrogJmp
- 카카오인턴
- 타겟 넘버
- 알고리즘
- 텔레그램
- codility
- java
- 안드로이드 스튜디오
- 문자열 내 마음대로 정렬하기
- 노션트렐로광고X
- 완주하지 못한 선수
- 더 나은 내일
- 다음 맵 api
- 최솟값
- Spring
- 프로그래머스
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함