JadenCase란 모든 단어의 첫 문자가 대문자이고, 그 외의 알파벳은 소문자인 문자열입니다. 단, 첫 문자가 알파벳이 아닐 때에는 이어지는 알파벳은 소문자로 쓰면 됩니다. (첫 번째 입출력 예 참고)
제한 조건
문자열 s가 주어졌을 때, s를 JadenCase로 바꾼 문자열을 리턴하는 함수, solution을 완성해주세요.입출력 예sreturn
- s는 길이 1 이상 200 이하인 문자열입니다.
- s는 알파벳과 숫자, 공백문자(" ")로 이루어져 있습니다.
- 숫자는 단어의 첫 문자로만 나옵니다.
- 숫자로만 이루어진 단어는 없습니다.
- 공백문자가 연속해서 나올 수 있습니다.
"3people unFollowed me" "3people Unfollowed Me" "for the last week" "For The Last Week"
20220910 진행중인 코드
일부 런타임 에러와 실패가 뜬다.. 왜지??;;;;
import java.util.*;
class Solution {
public String solution(String s) {
String answer ="";
String[] strArr = Arrays.stream(s.split(" "))
.map(a -> {
//3. 첫 글자가 숫자인지 확인
if(a.substring(0,1).matches("[0-9]")){
a = a.substring(0,1)
+ a.substring(1,a.length()).toLowerCase();
}else{
a = a.substring(0,1).toUpperCase()
+ a.substring(1,a.length()).toLowerCase();
}
// System.out.println("a : " + a);
return a;
}).toArray(String[]::new);
for(String str : strArr){
answer += str + " ";
}
return answer.trim();
}
}
이후 람다식이 아닌 일반적인 for문으로 해보았으나 결과는 똑같았다. 그리고 어째더 람다식이 더 복잡해보이고 가독성이 떨어져 보이는건 기분탓인가??
import java.util.*;
class Solution {
public String solution(String s) {
String[] strList = s.split(" ");
String answer = "";
for(String word : strList){
if(word.substring(0,1).matches("[0-9]")){
answer += " "
+ word.substring(0,1)
+ word.substring(1).toLowerCase();
}else{
answer += " "
+ word.substring(0,1).toUpperCase()
+ word.substring(1).toLowerCase();
}
}
return answer.trim();
}
}
현재 예상가는 실패 지점은 아무래도 substring을 하는 지점 같다. 길이가 충분치?.. 않아서 에러가 나는게 아닐까...
는 실험해보았으나 아니다. 그런데 엄청 중요한걸 보았다. '공백문자가 연속해서 나올 수 있다' 라는 조건문.... 난 처음에 없다라고 읽고 넘어갔다... 무친... 그 부분을 고쳐보자..
1. s.split(" ") -> 이 부분을 정규식으로 하나이상의 공백으로 바꾸면 시간초과가 날지언정 런타임에러는 나지 않을것이다!...
import java.util.*;
class Solution {
public String solution(String s) {
String[] strList = s.split("\\s+");
String answer = "";
for(String word : strList){
if(word.substring(0,1).matches("[0-9]")){
answer += " "
+ word.substring(0,1)
+ word.substring(1).toLowerCase();
}else{
answer += " "
+ word.substring(0,1).toUpperCase()
+ word.substring(1).toLowerCase();
}
}
return answer.trim();
}
}
결과는 예상했던대로 런타임 에러는 나지 않았다.
그.러.나
실패한 케이스들이 있다. 뭐지?;;... 이해가 안되는데.... 시간이 1시간 정도 흘러 다른 풀이를 참고하도록 하자.. ㅠㅠ
20220910 풀이참고
와... 대박 전혀 생각지도 못한 방법이 있었다.
전체적인 코드가 틀린건 아닌데, 너무 쉽기도 하고, 이건 엣지케이스에 대한 처리를 보기 때문에 lv2가 된것 같다.
마지막 글자가 공백으로 나오는 경우가 있을수 있다는....
그래서 모든 공백을 없애는게 아니라, 모든 공백 문자를 한번씩?.. 체크를 해야한다. 생각해보니 공백이 여러개 있을수 있다는걸 알았는데 다시 합칠때는 공백을 1개씩만 추가해줬었다... 아... 이런... ㅋㅋㅋㅋ
import java.util.*;
class Solution {
public String solution(String s) {
String answer = "";
String[] str=s.split(" ");
StringBuilder sb=new StringBuilder();
boolean flag=true;
for(int i=0;i<s.length();i++){
String ch=s.charAt(i)+"";
if(ch.equals(" ")){ // 공백이면 다음은 대문자
flag=true;
sb.append(ch);
continue;
}
if(flag){ // 대문자로 만들어야 함
sb.append(ch.toUpperCase());
flag=false;
}
else sb.append(ch.toLowerCase()); // 소문자
}
answer=sb.toString();
return answer;
}
}
refs
https://school.programmers.co.kr/learn/courses/30/lessons/12951
https://iamheesoo.github.io/blog/algo-prog12951
'알고리즘' 카테고리의 다른 글
프로그래머스[70129] - 이진 변환 반복하기(lv2) (0) | 2022.09.11 |
---|---|
프로그래머스[42885] - 구명보트(lv2) (0) | 2022.09.11 |
최댓값과 최솟값(lv2) (0) | 2022.09.09 |
124 나라의 숫자(lv2) (0) | 2022.09.09 |
없는 숫자 더하기(lv1) (0) | 2022.09.03 |