문제
JadenCase란 모든 단어의 첫 문자가 대문자이고, 그 외의 알파벳은 소문자인 문자열입니다. 단, 첫 문자가 알파벳이 아닐 때에는 이어지는 알파벳은 소문자로 쓰면 됩니다. (첫 번째 입출력 예 참고)
문자열 s가 주어졌을 때, s를 JadenCase로 바꾼 문자열을 리턴하는 함수, solution을 완성해주세요.
제한사항
- s는 길이 1 이상 200 이하인 문자열입니다.
- s는 알파벳과 숫자, 공백문자(" ")로 이루어져 있습니다.
- 숫자는 단어의 첫 문자로만 나옵니다.
- 숫자로만 이루어진 단어는 없습니다.
- 공백문자가 연속해서 나올 수 있습니다.
class Solution {
public String solution(String s) {
StringBuilder answer = new StringBuilder();
for(int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
if(i == 0 || s.charAt(i-1) == ' ' && Character.isLowerCase(ch)) {
ch = Character.toUpperCase(ch);
}
else if(s.charAt(i-1) != ' ' && Character.isUpperCase(ch)) {
ch = Character.toLowerCase(ch);
}
answer.append(ch);
}
return answer.toString();
}
}
문자열의 문자를 하나씩 가져와서 첫 글자이거나 이전 글자가 공백이며 현재 글자가 소문자라면 대문자로 교체 후 StringBuilder에 append 하는 방식이다.
결과는 아래와 같다.
그리고 아래 코드는 다른사람풀이를 보다가 너무 좋은 아이디어여서 이해한 후 다시 구현해본 방법이다.
class Solution {
public String solution(String s) {
StringBuilder answer = new StringBuilder();
String[] strArr = s.toLowerCase().split("");
boolean blank = true;
for(String str : strArr) {
answer.append((blank) ? str.toUpperCase() : str);
blank = str.equals(" ");
}
return answer.toString();
}
}
그리고 결과는 아래와 같다.
가독성은 당연히 두번째 코드가 좋지만 생각보다 시간이 좀 더 걸린 것 같은데, 아마 문자열을 배열로 만드는 과정과 문자열을 매번 공백인지 비교하는 과정에서 시간이 좀 더 걸린 게 아닌가 싶다.
물론 두 번째 코드가 효율이 더 안좋다고 단정지을 수 없는건 사실이다. 그냥 다방면에서 생각해본다면 그렇다는 얘기일뿐.
(사실 전체적으로 본다면 두 번째 코드가 더 좋은 코드일 것이라 생각한다)
출처
https://school.programmers.co.kr/learn/courses/30/lessons/12951