문제 설명
JadenCase란 모든 단어의 첫 문자가 대문자이고, 그 외의 알파벳은 소문자인 문자열입니다. 단, 첫 문자가 알파벳이 아닐 때에는 이어지는 알파벳은 소문자로 쓰면 됩니다. (첫 번째 입출력 예 참고)
문자열 s가 주어졌을 때, s를 JadenCase로 바꾼 문자열을 리턴하는 함수, solution을 완성해주세요.
- s는 길이 1 이상 200 이하인 문자열입니다.
- s는 알파벳과 숫자, 공백문자(" ")로 이루어져 있습니다.
- 숫자는 단어의 첫 문자로만 나옵니다.
- 숫자로만 이루어진 단어는 없습니다.
- 공백문자가 연속해서 나올 수 있습니다.
"3people unFollowed me" | "3people Unfollowed Me" |
"for the last week" | "For The Last Week" |
----
정답
- " " 공백문자가 여러개 올경우 split의 경우 오류가 발생합니다 tokenizer의 true 로 사용하시는 걸 추천드립니다.
StringTokenizer(String str, String delim, boolean flag) : flag는 구분자 자체도 토큰으로 인식하게 할지 여부를 정한다. 예를 들어 true라면 "Hi I'm Song!!"는 공백을 포함하여"HI", " ", "I'm", " ", "Song!!" 이렇게 5개의 토큰으로 파싱 된다.
import java.util.*;
class Solution {
public String solution(String s) {
s = s.toLowerCase(); //처음부터 다 소문자로 바꿔버리기
StringTokenizer st = new StringTokenizer(s, " ", true);
StringBuilder sb = new StringBuilder();
while (st.hasMoreTokens()) {
String word = st.nextToken();
// 만약 단어가 공백이면 그대로 출력해주고
if (word.equals(" "))
sb.append(word);
else { //아니라면 첫글자 대문자 변환해주기
sb.append(word.substring(0, 1).toUpperCase() + word.substring(1));
}
}
return sb.toString();
}
}
다른 풀이법
class Solution {
public String solution(String s) {
String answer = "";
String[] words = s.toLowerCase().split("");
boolean flag = true;
for (String word : words) {
answer += flag ? word.toUpperCase() : word;
flag = word.equals(" ") ? true : false;
}
return answer;
}
}
JadenCase 문자열 만들기 자바 런타임에러
첫 시도 - 틀린코드
class Solution {
public String solution(String s) {
String[] arr = s.toLowerCase().split(" ");
String answer = "";
for (int i = 0; i < arr.length; i++) {
String change = arr[i].substring(0, 1).toUpperCase() + arr[i].substring(1)+ " ";
answer += change;
}
answer = answer.substring(0, answer.length() - 1);
return answer;
}
}
어어어..? 런타임에러뭔데....
두번째 시도 - 그러나 또 틀린 코드
class Solution {
public String solution(String s) {
String[] arr = s.toLowerCase().split(" ");
String answer = "";
for (int i = 0; i < arr.length; i++) {
String first_toUpper = String.valueOf(Character.toUpperCase(arr[i].charAt(0)));
String change = first_toUpper + arr[i].substring(1) + " ";
answer += change;
}
answer = answer.substring(0, answer.length() - 1);
return answer;
}
}
찾아보니 split을 쓰며 당연하게 공백이 한개만 들어온다고 생각해서 그런 것 같다.
Tip. 공백이 한번만 나온다는 말은 어디에도 없지만 당연하게 공백이 단어 사이에 하나만 존재할것이라 생각하고 공백으로 파싱하거나하는 실수
'알고리즘 공부 > 프로그래머스 문제풀이' 카테고리의 다른 글
[프로그래머스] 올바른 괄호 (0) | 2022.11.24 |
---|---|
[프로그래머스] 같은 숫자는 싫어(JAVA) (0) | 2022.11.23 |
[프로그래머스] 최솟값 만들기 (0) | 2022.11.21 |
[프로그래머스] 최댓값과 최솟값 (JAVA) (0) | 2022.11.15 |
[프로그래머스] 짝수와 홀수 (JAVA) (0) | 2022.11.15 |