Lewis's Tech Keep
[프로그래머스] 브라이언의 고민 본문
- 틀린 답
- 틀린 답입니다.
- 틀린 이유 : 규칙에 넣는 특수 문자 패턴을 기준으로 생각하면 예외를 깔끔하게 나눌 수 있었을 텐데 문구 전체로 생각해서 중간에 나오는 예외들이 너무 많아졌다.
- 현재 코드에서 안되는 반례 : ( "XcXbXcX" -> "X XX X")
더보기
import java.util.*;
class Solution {
private boolean isLowerCase(char c) {
return c-'a' >= 0 && c-'z' <= 0;
}
private boolean isUpperCase(char c) {
return c-'A' >= 0 && c-'Z' <=0;
}
private boolean isNoSpace(String str) {
for(int i=0; i<str.length(); i++) {
char c = str.charAt(i);
if(c == ' ') {
return false;
}
}
return true;
}
private boolean isAllUpperCase(String str) {
for(int i=0; i<str.length(); i++) {
char c = str.charAt(i);
if(isLowerCase(c)) {
return false;
}
}
return true;
}
private String getOnlyUpperCase(String str) {
StringBuilder sb = new StringBuilder();
for(int i=0; i<str.length(); i++) {
char c = str.charAt(i);
if(isUpperCase(c)) {
sb.append(c);
}
}
return sb.toString();
}
public String solution(String sentence) {
String answer = "";
boolean isValid = true;
if(!isNoSpace(sentence)) {
return "invalid";
}
if(isAllUpperCase(sentence)) {
return sentence;
}
int cIndex = 0;
int eIndex = 0;
char sChar;
while(cIndex < sentence.length()-1) {
sChar = sentence.charAt(cIndex);
if(cIndex > 0)
answer += " ";
// System.out.println("cIndex : " + cIndex);
// System.out.println("sChar : " + sChar);
if(isLowerCase(sChar)) {
// 소문자 시작 -> rule 2 check
// findIdx 다음 같은 소문자 전까지
// idx 2에서 찾았을 경우 4에도 있으면 오류 : 같은 소문자 2개 들어간 경우
eIndex = findRule2Idx(sentence, sChar, cIndex);
if(eIndex == -1) {
return "invalid";
}
// rule 2의 경우 내부에 rule 1 이 존재할 수 있음.
// rule 1 체크 한번 더 해 줘야 함.
// 룰 2가 두번 들어갈 수는 없다.
String subPart = sentence.substring(cIndex+1, eIndex);
if(isLowerCase(sentence.charAt(cIndex+1))) {
return "invalid";
}
if(findRule1Idx(subPart, subPart.charAt(1), 0) == -1) {
return "invalid";
}
answer += getOnlyUpperCase(sentence.substring(cIndex, eIndex+1));
cIndex = eIndex+1;
} else {
// 대문자 시작 -> rule 1 check
// findIdx 다음 다른 소문자를 찾으면 마지막 현재 소문자의 위치 = eIndex
// 대문자로 시작하면 끝도 대문자로 끝나야함.
sChar = sentence.charAt(cIndex+1);
eIndex = findRule1Idx(sentence, sChar, cIndex);
if(eIndex == -1) {
return "invalid";
}
answer += getOnlyUpperCase(sentence.substring(cIndex, eIndex+1));
cIndex = eIndex+1;
}
}
return answer;
}
private int findRule2Idx(String str, char sChar, int cIndex) {
int count = 0;
int idx = -1;
int len = str.length();
for(int i=cIndex+1;i<len; i++) {
char c = str.charAt(i);
if(sChar == c) {
idx = i;
count++;
}
}
return count > 1 ? -1 : idx; // 있어서는 안 됨
}
private int findRule1Idx(String str, char sChar, int cIndex) {
int idx = -1;
int len = str.length();
for(int i=cIndex+1;i<len; i++) {
char c = str.charAt(i);
if(sChar == c) {
idx = i;
}
if(isLowerCase(c) && sChar != c) {
return idx+1;
}
}
if(idx+1 >= len || isLowerCase(str.charAt(idx+1))) return -1;
return idx != -1 ? ++idx : idx;
}
}
'JAVA > 알고리즘' 카테고리의 다른 글
[프로그래머스] 보행자 천국 - 실패 (0) | 2021.04.27 |
---|---|
[프로그래머스] 자물쇠와 열쇠 (0) | 2021.04.16 |
[프로그래머스] 풍선 터트리기 (0) | 2021.04.15 |
[백준] 외판원 순회 (0) | 2021.04.15 |
[백준] 고층 빌딩 (0) | 2021.04.13 |
Comments