📝 문제
JadenCase란 모든 단어의 첫 문자가 대문자이고, 그 외의 알파벳은 소문자인 문자열입니다. 단, 첫 문자가 알파벳이 아닐 때에는 이어지는 알파벳은 소문자로 쓰면 됩니다. (첫 번째 입출력 예 참고)
문자열 s가 주어졌을 때, s를 JadenCase로 바꾼 문자열을 리턴하는 함수, solution을 완성해주세요.
1️⃣ 첫번째 시도
public class Solution {
String solution(String s) {
String[] words = s.split(" ");
StringBuilder JadenCaseStringBuilder = new StringBuilder();
for (int i = 0; i < words.length; i++) {
char start = words[i].charAt(0);
if (start >= 'a' && start <= 'z') {
JadenCaseStringBuilder.append(words[i].substring(0, 1).toUpperCase());
JadenCaseStringBuilder.append(words[i].substring(1).toLowerCase());
} else {
JadenCaseStringBuilder.append(words[i]);
}
if (i < words.length - 1) {
JadenCaseStringBuilder.append(" ");
}
}
return JadenCaseStringBuilder.toString();
}
}
첫번째 시도는 각종 런타임 에러로 인해 실패했다.
테스트는 통과 하였지만 내가 생각하지 못한 반례가 있었던 것 같다.
2️⃣ 두번째 시도
소문자 사이에 대문자가 껴있는 반례를 하나 찾아서 테스트 케이스에 추가하였다. 코드는 다음과 같다
그러나 결과는 첫번째 시도와 같았다. 아직 해결되지 않은 반례가 더 남아있는것 같다.
3️⃣ 세번째 시도
공백 문자가 연속으로 나올 수 있는 조건을 놓치고 있던것을 발견하였고 테스트 케이스에 추가하니 예상대로 에러가 발생했다.
class Solution {
public String solution(String s) {
String[] words = s.split(" ");
StringBuilder JadenCaseStringBuilder = new StringBuilder();
for (int i = 0; i < words.length; i++) {
if(words[i].isEmpty()) {
JadenCaseStringBuilder.append(" ");
continue;
}
char start = words[i].charAt(0);
if ((start >= 'a' && start <= 'z')) {
JadenCaseStringBuilder.append(words[i].substring(0, 1).toUpperCase());
JadenCaseStringBuilder.append(words[i].substring(1).toLowerCase());
} else {
JadenCaseStringBuilder.append(words[i].toLowerCase());
}
if (i < words.length - 1) {
JadenCaseStringBuilder.append(" ");
}
}
return JadenCaseStringBuilder.toString();
}
}
위 코드와 같이 수정하여서 실패 케이스가 줄어들었지만 여전히 실패하고 있었다.
4️⃣ 네번째 시도
단어의 첫번째 문자가 대문자로 오는 케이스여도 제대로 동작할 거라고 생각했는데 조건식에 오류가 있었다.
class Solution {
public String solution(String s) {
String[] words = s.split(" ");
StringBuilder JadenCaseStringBuilder = new StringBuilder();
for (int i = 0; i < words.length; i++) {
if(words[i].isEmpty()) {
JadenCaseStringBuilder.append(" ");
continue;
}
char start = words[i].charAt(0);
if ((start >= 'A' && start <= 'Z') || (start >= 'a' && start <= 'z')) {
JadenCaseStringBuilder.append(words[i].substring(0, 1).toUpperCase());
JadenCaseStringBuilder.append(words[i].substring(1).toLowerCase());
} else {
JadenCaseStringBuilder.append(words[i].toLowerCase());
}
if (i < words.length - 1) {
JadenCaseStringBuilder.append(" ");
}
}
return JadenCaseStringBuilder.toString();
}
}
위와 같이 코드를 수정하였지만 실패 하였다. 여전히 반례가 남아있는듯 하다
하지만 이번에는 한가지 테스트 케이스만을 제외하고 모두 성공하여서 정답까지 다 왔다는 느낌이 들었다
시간 초과는 발생하지 않아서 다행이었다
🔥 풀이 성공
입력받은 문자열의 마지막 인덱스가 공백인 경우 split할 때 배열의 요소로 포함되지 않아 기댓값과 결과가 다르게 나오는 케이스를 발견하였다
class Solution {
public String solution(String s) {
String[] words = s.split(" ");
StringBuilder JadenCaseStringBuilder = new StringBuilder();
for (int i = 0; i < words.length; i++) {
if (words[i].isEmpty()) {
JadenCaseStringBuilder.append(" ");
continue;
}
char start = words[i].charAt(0);
if ((start >= 'A' && start <= 'Z') || (start >= 'a' && start <= 'z')) {
JadenCaseStringBuilder.append(words[i].substring(0, 1).toUpperCase());
JadenCaseStringBuilder.append(words[i].substring(1).toLowerCase());
} else {
JadenCaseStringBuilder.append(words[i].toLowerCase());
}
if (i < words.length - 1) {
JadenCaseStringBuilder.append(" ");
}
}
// 입력받은 문자열의 맨 끝이 공백이면 공백을 추가해준다.
if (s.endsWith(" ")) {
JadenCaseStringBuilder.append(" ");
}
return JadenCaseStringBuilder.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;
}
}
'스터디 > 99클럽 코테 스터디 TIL' 카테고리의 다른 글
99클럽 코테 스터디 6일차 TIL 의상 (0) | 2024.07.28 |
---|---|
99클럽 코테 스터디 5일차 TIL 전화번호 목록 (0) | 2024.07.26 |
99클럽 코테 스터디 3일차 TIL 문자열 내 마음대로 정렬하기 (1) | 2024.07.25 |
99클럽 코테 스터디 2일차 TIL x만큼 간격이 있는 n개의 숫자 (2) | 2024.07.23 |
99클럽 코테 스터디 1일차 TIL n^2 배열 자르기 (3) | 2024.07.23 |