반응형
- 첫 풀이 및 정답풀이
이 문제를 접근하는 방식에 대해서는 제대로 접근하였지만, 고려하지 못한 부분으로 인해 시간이 좀 걸렸다. 우선 이 문제는 프로그래머스 level 1의 '이상한 문자 만들기' 문제와 유사하게 주어지는 문자열 내부에 공백이 존재하는 경우를 고려해 주어야 한다.
예를 들어 "_A__sdf_fFt_"라는 입력이 주어졌을 때, 출력해야 하는 결과는 "_A__Sdf_Fft_"가 된다. 즉, split() 메서드를 이용해 공백을 구분자로 하여 문자열들을 분리할 때, 공백을 무시하지 않도록 split() 메서드의 limit값을 -1로 주어야 한다. 이렇게 문자열을 분해하면, {_ , A, _, sdf, fFt, _}로 분해가 된다.
이 상태에서 각 요소를 참조했을 때, 공백이라면 공백만을 추가하고 알파벳인 경우는 split의 기준점이 된 공백을 하나 더 추가해주어야 한다.
즉, 0번 인덱스인 공백은 공백, A는 그대로 후 공백, 2번 인덱스 공백 역시 그대로 공백( 앞선 A 이후의 공백으로 공백이 2개), 3번 인덱스는 Sdf 후 공백, 4번 인덱스 역시 Fft 후 공백을 취한다. 5번 인덱스의 경우 4번에 의해 공백이 하나 추가된 상태이기 때문에 5번 인덱스의 공백을 또 넣게 된다면 마지막에 공백이 2개가 되므로, 마지막 인덱스가 공백이라면, 무시하는 별도의 조건이 필요하다.
class Solution {
public String solution(String s) {
// 1. 문자열 변경이 잦으므로 StringBuilder로 객체 생성.
StringBuilder answer = new StringBuilder();
// 2. 주어진 문자열을 소문자로 모두 변경.
s = s.toLowerCase();
// 3. 공백또한 고려하기 위해 limit를 -1로.
String[] str = s.split(" ",-1);
// 4. 저장된 문자열 배열 탐색.
for(int i = 0;i<str.length;i++){
// 5. 공백인 경우
if(str[i].length() ==0){
// 6. 마지막 문자가 공백인 경우는 그냥 무시.
if(i == str.length-1) continue;
// 7. 나머지 공백은 공백을 삽입.
answer.append(" ");
continue;
}
// 8. 첫 글자가 알파벳인 경우, 첫 글자만 대문자로 만든 뒤 나머지를 붙여준다.
else if(str[i].charAt(0) >='a' && str[i].charAt(0) <='z'){
answer.append(str[i].substring(0,1).toUpperCase());
answer.append(str[i].substring(1,str[i].length()));
// 9. 첫 글자가 알파벳이 아닌 경우는 그냥 붙인다.
}else{
answer.append(str[i]);
}
// 10. 마지막 문자를 제외하고 문자를 붙인 뒤 공백을 붙여준다.
if(i != str.length-1)
answer.append(" ");
}
return answer.toString();
}
}
반응형