99클럽 코테 스터디 4일차 TIL JadenCase 문자열 만들기

2024. 7. 25. 14:01·스터디/99클럽 코테 스터디 TIL

📝 문제

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
'스터디/99클럽 코테 스터디 TIL' 카테고리의 다른 글
  • 99클럽 코테 스터디 6일차 TIL 의상
  • 99클럽 코테 스터디 5일차 TIL 전화번호 목록
  • 99클럽 코테 스터디 3일차 TIL 문자열 내 마음대로 정렬하기
  • 99클럽 코테 스터디 2일차 TIL x만큼 간격이 있는 n개의 숫자
Been
Been
  • Been
    Been
    Been
  • 전체
    오늘
    어제
    • 분류 전체보기 (60)
      • 언어 (0)
        • Kotlin (0)
      • 안드로이드 (17)
      • iOS (3)
      • Git (1)
      • 스터디 (39)
        • 알고리즘 문제 풀이 (1)
        • 99클럽 코테 스터디 TIL (38)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    언더라인 제거
    밑줄제거
    IOS
    TIL
    FragmentStateAdapter
    RecyclerView
    리싸이클러뷰
    NSR
    Androiod
    안드로이드
    java
    개발자취업
    Android
    자바
    nsl
    쓰기권한
    코딩테스트준비
    Coroutines
    99클럽
    풀이실패
    WRITE EXTERNAL
    maxWidth
    AndroidID
    깃
    객체변환
    debugRuntimeClasspath
    EditText
    Git
    항해99
    아이폰
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
Been
99클럽 코테 스터디 4일차 TIL JadenCase 문자열 만들기
상단으로

티스토리툴바