[연습문제][lv.2] JadenCase 문자열 만들기 - 자바(Java)
문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/12951
문제
문제 설명
JadenCase란 모든 단어의 첫 문자가 대문자이고, 그 외의 알파벳은 소문자인 문자열입니다. 단, 첫 문자가 알파벳이 아닐 때에는 이어지는 알파벳은 소문자로 쓰면 됩니다. (첫 번째 입출력 예 참고)
문자열 s가 주어졌을 때, s를 JadenCase로 바꾼 문자열을 리턴하는 함수, solution을 완성해주세요.
제한 조건
- s는 길이 1 이상 200 이하인 문자열입니다.
- s는 알파벳과 숫자, 공백문자(" ")로 이루어져 있습니다.
- 숫자는 단어의 첫 문자로만 나옵니다.
- 숫자로만 이루어진 단어는 없습니다.
- 공백문자가 연속해서 나올 수 있습니다.
입출력 예
s | retun |
"3people unFollowed me" | "3people Unfollowed Me" |
"for the last week" | "For The Last Week" |
✅ 풀이 과정
😵 처음에 틀린코드
✔️ 수도코드/ 알고리즘 생각
문자열 배열을 자른다. split(" ")
각 String 을 for문을 돌면서 첫번째 인덱스에 해당하는 값이 a-z에 해당하는지 확인한다.
해당하면 대문자로 바꾼다.
근데 이대로 하면 틀린다 ㅋㅋㅋ
split()을 잘못 사용하면 런타임 에러가 발생한다.
잘 사용한다고 해도 테스트케이스중에 틀리는게 발생할 수 있다. .....
split을 쓰면 ?
당연하게 공백이 여러개가 들어왔을 때 파싱 결과가 잘못될 수 있나보다.
import java.util.*;
class Solution {
public String solution(String s) {
StringBuilder answer = new StringBuilder();
String[] words = s.split(" ");
for (String word : words) {
if(word.length() == 0)
answer.append(" ");
else {
char firstChar = word.charAt(0);
if ('a' <= firstChar && firstChar <= 'z')
firstChar = Character.toUpperCase(firstChar);
word = firstChar + word.substring(1).toLowerCase();
answer.append(word).append(" ");
}
}
answer.deleteCharAt(answer.length()-1);
return answer.toString();
}
}
이런 문제에선 토크나이저를 쓰는게 안전하다.
이런 문제를 구별하는 능력이 필요하겠지만... 일단 공부하자
✅ 토크나이저를 이용하자. (정답 코드)
토크나이저를 이용하며
StringTokenizer(String str, String delim, boolean flag)
flag는 구분자 자체도 토큰으로 인식하게 할지 여부를 결정
true 일때
>>> "Hello World!"는 공백을 포함하여"Hello", " ", "World!" 이렇게 3개의 토큰으로 파싱
import java.util.*;
class Solution {
public String solution(String s) {
s = s.toLowerCase();
StringTokenizer st = new StringTokenizer(s, " ", true);
StringBuilder answer = new StringBuilder();
while(st.hasMoreTokens()) {
String word = st.nextToken();
if(word.length() == 0) {
answer.append(" ");
}
else {
answer.append(word.substring(0,1).toUpperCase() + word.substring(1));
}
}
return answer.toString();
}
}
✅ 문제를 풀기 위해 새롭게 학습한 것
- 토크나이저
- 토크나이저로 문자열 분리하기
- Tokenizer(String str, String delim, boolean flag)
- StringTokenizer st = new StringTokenizer(s, " ", true);
- 토큰이 있으면 반복, 다음 토큰 가져오기
- while(st.hasMoreTokens()) {
String word = st.nextToken();
}
- 토크나이저로 문자열 분리하기
- String substring(int start, int end );
- 문자열을 반환하는데, 시작위치와 끝을 지정해줌( 끝-1까지 반환함)
- String substring(int index);
- 몇번쨰 위치인지 정하면, 해당 위치부터 이후의 모든 문자열을 반환함
references