https://school.programmers.co.kr/learn/courses/30/lessons/12951
(정답률 77%)
JadenCase란 모든 단어의 첫 문자가 대문자이고, 그 외의 알파벳은 소문자인 문자열입니다. 단, 첫 문자가 알파벳이 아닐 때에는 이어지는 알파벳은 소문자로 쓰면 됩니다. (첫 번째 입출력 예 참고)
문자열 s가 주어졌을 때, s를 JadenCase로 바꾼 문자열을 리턴하는 함수, solution을 완성해주세요.
s | return |
---|---|
"3people unFollowed me" | "3people Unfollowed Me" |
"for the last week" | "For The Last Week" |
class Solution {
public String solution(String s) {
StringBuilder sb = new StringBuilder();
//주어진 문자열을 소문자로 변환한 뒤 배열로 만든다
String[] strings = s.toLowerCase().split(" ");
for (int i = 0; i < strings.length; i++) {
//공백은 연속으로 나올수 있기 때문에 배열의 원소가 ""일때 반복 생략
if (strings[i].equals("")) {
continue;
}
//배열의 원소의 첫글자가 솟자일 경우도 생략
if (Character.isDigit(strings[i].charAt(0))) {
continue;
}
//배열의 원소의 첫 글자만 대문자로 만든다
strings[i] = strings[i].substring(0, 1).toUpperCase()
+ strings[i].substring(1);
}
//배열을 Stringbuilder 객체로 변환
for (int i = 0; i < strings.length; i++) {
sb.append(strings[i]);
if (i != strings.length - 1) {
sb.append(" ");
}
}
//주어진 문자열의 마지막 단어가 "me " 이런식으로 주어졌을 경우
//배열을 만드는 단계에서 공백을 생략했었기 때문에 예외가 발생
//주어진 문자열과 Stringbuilder 객체의 길이를 비교하여
//공백을 추가해준다
if (sb.length() < s.length()) {
for (int i = 0; i <= s.length() - sb.length(); i++) {
sb.append(" ");
}
}
return sb.toString();
}
}
class Solution {
public String solution(String s) {
String answer = "";
//주어진 문자열을 소문자로 변경한 뒤 모든 문자로 나누어 배열 생성
String[] sp = s.toLowerCase().split("");
boolean flag = true;
//공백을 기준으로 첫번째 단어인지 판단하여 대문자로 변경
for(String ss : sp) {
answer += flag ? ss.toUpperCase() : ss;
flag = ss.equals(" ") ? true : false;
}
return answer;
}
}
문제 자체는 크게 어렵지 않았는데 마지막 단어 끝에 공백이 있을 경우를
쉽게 해결하지 못했다. 결국 아이디어는 생각해냈지만 시간이 좀 걸렸다.
놀라운건 좋아요가 높은 풀이였다..
배열을 공백으로 나누어 만든게 아니라 그냥 구분없이 만들어서
숫자, 문자, 공백 구분도 없이 그냥 공백 다음에 올 경우 그냥 대문자로 만들었다..
예전에도 숫자나 공백을 그냥 대문자 소문자로 변경해서 푼 풀이를 본거 같은데
참 대단하다..