문제
JadenCase란 모든 단어의 첫 문자가 대문자이고, 그 외의 알파벳은 소문자인 문자열입니다. 단, 첫 문자가 알파벳이 아닐 때에는 이어지는 알파벳은 소문자로 쓰면 됩니다. (첫 번째 입출력 예 참고)
문자열 s가 주어졌을 때, s를 JadenCase로 바꾼 문자열을 리턴하는 함수, solution을 완성해주세요.
제한 조건
- s는 길이 1 이상 200 이하인 문자열입니다.
- s는 알파벳과 숫자, 공백문자(" ")로 이루어져 있습니다.
- 숫자는 단어의 첫 문자로만 나옵니다.
- 숫자로만 이루어진 단어는 없습니다.
- 공백문자가 연속해서 나올 수 있습니다.
- 출력 예시 -
정답 코드
< 내 정답 코드 > ★ 오답 ★
class Solution {
public String solution(String s) {
String[] strArr = s.split(" ", -1);
// if (s.substring(s.length() - 1, s.length()).equals(" ")) {
// strArr[strArr.length - 1] += " ";
// }
String answer = "";
for (int i = 0; i < strArr.length; i++) {
String word = "";
for (int j = 0; j < strArr[i].length(); j++) {
if (j == 0 && 'a' <= strArr[i].charAt(j) && strArr[i].charAt(j) <= 'z') {
word += Character.toUpperCase(strArr[i].charAt(j));
} else if ('A' <= strArr[i].charAt(j) && strArr[i].charAt(j) <= 'Z') {
word += Character.toLowerCase(strArr[i].charAt(j));
} else {
word += strArr[i].charAt(j);
}
}
strArr[i] = word;
}
answer += strArr[0];
for (int i = 1; i < strArr.length; i++) {
answer += " " + strArr[i];
}
return answer;
}
}
< 내 정답 코드 >
class Solution {
public String solution(String s) {
String[] strArr = s.split("");
String answer = "";
answer = strArr[0].toUpperCase();
for (int i = 1; i < strArr.length; i++) {
if (strArr[i - 1].equals(" ")) {
answer += strArr[i].toUpperCase();
} else {
answer += strArr[i].toLowerCase();
}
}
return answer;
}
}
< 타인 답변 코드 >
class Solution {
public String solution(String s) {
String result = "";
String[] strArr = s.toLowerCase().split("");
boolean isTrue = true;
// for문을 통해서 이전에 공백이 있으면 해당 문자를 대문자로 변경한다.
for (String str : strArr) {
result += isTrue ? str.toUpperCase() : str;
isTrue = str.equals(" ") ? true : false;
}
// String으로 만든다.
return result;
}
}
이것을 주의하자!
- 정말 시간이 많이 걸린 문제다. 일단 오답 코드에서 틀린 이유는 split(" ") 메서드를 통해 '공백'을 기준으로 단어를 나눴기 때문이다. 문제 예시를 보면 누가 봐도 공백을 기준으로 나눈 다음 charAt( ) 메서드로 앞 글자만 대문자로 바꿔주면 될 것 같다. 하지만 이것이 이 문제의 함정이다!!
다시 말해 공백도 '문자' 취급을 해야했다. 그러나 split(" ") 메서드를 사용하면 공백을 기준으로 나누기 때문에 올바른 값이 나올수 없었다. 따라서 정답으로 향하는 길은 '공백'까지 문자 취급해주는 split("") 메서드이다.
- split("") 메서드를 통해 공백을 포함한 모든 문자열을 String 배열로 만든다. 이후엔 내 정답 코드나 타인 답변 코드와 같이 다른 스타일로 풀 수 있다. 내 경우엔 단어의 맨 앞자리만 대문자로 바꿔야 하기에 for 문을 사용해서 해당 자리 앞에 공백인 경우에만 대문자로 바꿨고, 나머지는 소문자로 바꿨다.
- 타인 답변 코드에선 boolean 변수를 통해서 자기 자리가 공백인 경우에만 true 값을 주고 나머지는 false 값을 줘서 공백 다음에 오는 문자만 대문자로 변경하도록 했다.
- 이 문제는 "공백을 어떻게 처리할 것인가"에 대한 물음이다. 즉 split( ) 메서드를 사용하는 방법에 대해 묻는 것이다.
'코딩 테스트' 카테고리의 다른 글
[프로그래머스] (Lv.1) 폰켓몬 (0) | 2022.09.10 |
---|---|
[프로그래머스] (Lv.2) 이진 변환 반복하기 (0) | 2022.09.09 |
[프로그래머스] (Lv.2) 최댓값과 최솟값 (0) | 2022.09.08 |
[프로그래머스] (Lv.1) 숫자 문자열과 영단어 *** (0) | 2022.09.08 |
[프로그래머스] (Lv.1) K번째수 * (0) | 2022.09.08 |