problem-solving

[코테연습] JadenCase 문자열 만들기

힝뿌 2023. 10. 31. 00:31
반응형

프로그래머스 Lev.2 JadenCase 문자열 만들기 (Java)

얼마 전까지 python으로 코테를 준비했지만.. 직무 특성상 java로 코딩테스트를 보는 곳이 거의 대부분이라 java로 차근차근 코테를 다시 준비해보려고 한다. 예상은 했지만 역시나 쉽지 않다.

특히 문자열 부분에서 가장 많이 느끼는데, python은 문자열 문제를 정말 쉽게 풀 수 있지만 java는 그렇지 않은 것 같다.

문자열 문제 with Java... 내가 아직 실력이 부족해서일까.. 참.. 어렵다.. 너란 녀석...

https://school.programmers.co.kr/learn/courses/30/lessons/12951

 

문제)

JadenCase란 모든 단어의 첫 문자가 대문자이고, 그 외의 알파벳은 소문자인 문자열입니다. 단, 첫 문자가 알파벳이 아닐 때에는 이어지는 알파벳은 소문자로 쓰면 됩니다. (첫 번째 입출력 예 참고)
문자열 s가 주어졌을 때, s를 JadenCase로 바꾼 문자열을 리턴하는 함수, solution을 완성해 주세요.

 

제한 조건)

  • s는 길이 1 이상 200 이하인 문자열입니다.
  • s는 알파벳과 숫자, 공백문자(" ")로 이루어져 있습니다.
    • 숫자는 단어의 첫 문자로만 나옵니다.
    • 숫자로만 이루어진 단어는 없습니다.
    • 공백문자가 연속해서 나올 수 있습니다.

입출력 예)

s return
"3people unFollowed me" "3people Unfollowed Me"
"for the last week" "For The Last Week"

 


처음 떠오른 생각

  1. split(" ")으로 쪼개서 배열을 만든다.
  2. 공백이 연속해서 나올 수 있다고 했으니 공배이 나오면 공백 문자 추가
  3. 배열에서 첫 번째 글자만 대문자로 변경 후, 나머지 글자는 소문자로 변경
  4. 문자열 마지막에 공백이 들어가 있다면 제거하고 return

 

아래와 같이 코드 작성 후 돌려보면 

class Solution {
    public String solution(String s) {
        String[] sList = s.split(" ");
        String answer = "";
        
        for(int i=0; i<sList.length; i++) {
            
            if(sList[i].length() == 0) {
                answer += " ";
            } else {
                sList[i] = sList[i].substring(0, 1).toUpperCase() + sList[i].substring(1).toLowerCase() + " ";
                answer += sList[i];
            }
        }
        
        int len = answer.length();
        if(s.substring(s.length()-1, s.length()) == " ") {
            return answer;
        } else {
            return answer.substring(0, len-1);
        }
        
    }
}

다음과 같은 결과를 얻을 수 있다.

 

왜일까? 난 아무리 생각을 해봐도 잘 모르겠다. 

게다가 다른 케이스들은 다 통과를 하는데 왜 8번 케이스만 통과를 못하는 것일까?

결국 스스로 해결할 수 없었던 나는 구글링을 하기 시작했고 나와 비슷한 사람들이 많음을 알게 되었다.

그중에서 가장 설명을 잘해주신 블로그를 참고해 이유에 대해 작성해보고자 한다.

 

split()을 잘못 사용하면 런타임 에러가 발생한다고 한다.

잘 사용한다고 해도 테스트 케이스 중에 틀리는 부분이 발생할 수 있다고 한다.

즉, split을 사용하게 되면 공백이 여러 개 들어왔을 때 파싱 결과가 잘못될 수 있는 것 같다고 한다.

이러한 문제에서는 토크나이저를 사용하는 게 안전하다고 해서 토크나이저를 사용해서 문제를 풀어보았다.

import java.util.*;

class Solution {
    public String solution(String s) {
        StringTokenizer st = new StringTokenizer(s, " ", true);
        String answer = "";
        
        while(st.hasMoreTokens()) {
            String stn = st.nextToken();
            if(stn.length() == 0) {
                answer += " ";
            } else {
                answer = answer + stn.substring(0, 1).toUpperCase() + stn.substring(1).toLowerCase();
            }
        }
        return answer;
        
    }
}

결과는 모든 케이스 통과!

 

StringTokenizer랑 split의 차이가 궁금해 찾아보니 구분자가 연속으로 두 번 이상 나오는 경우에 차이점이 있었다.

 

StringTokenizer

StringTokenizer는 연속된 구분자를 하나의 구분자로 처리한다. 즉, 두 번 이상 연속으로 나오는 구분자는 하나의 구분자로 간주된다.

 

예시)

StringTokenizer tokenizer = new StringTokenizer("안녕,,안녕하세요", ",");
while (tokenizer.hasMoreTokens()) {
    String token = tokenizer.nextToken();
    System.out.println(token);
}

출력)

안녕
안녕하세요

 

split

split은 연속된 구분자를 무시하지 않고, 각각의 구분자를 빈 문자열("")로 처리한다. 즉, 연속된 구분자도 각각의 빈 문자열 토큰으로 처리되는 것이다.

 

예시)

String[] tokens = "안녕,,안녕하세요".split(",");
for (String token : tokens) {
    System.out.println(token);
}

출력)

안녕

안녕하세요

 

따라서 구분자가 연속으로 두 번 이상 나올 때, `StringTokenizer`는 하나의 구분자로 처리하고 빈 문자열을 생성하지 않으며, `split`은 연속된 구분자를 빈 문자열로 처리하여 더 많은 토큰을 생성한다. 상황에 맞게 사용하는 것이 중요할 듯하다.

 

 

StringTokenizer

생성자 설명
StringTokenizer(String str) 문자열 str에 대한 문자열 토크나이저를 구성한다.
StringTokenizer(String str, String delim) 문자열 str을 지정한 구분자인 delim으로 나누는 문자열 토크나이저를 구성한다.
StringTokenizer(String str, String delim, boolean returnDelims) 문자열 str을 지정한 구분자인 delim으로 나누는 문자열 토크나이저를 구성한다. (returnDelim = true이면 구분자도 토큰으로 간주한다.)
메서드 타입 설명
hasMoreTokens() boolean 사용가능한 토큰이 더 있는가?
nextToken() String 다음 토큰을 반환
countToken() int 전체 토큰의 수 반환

 

 

꾸준한 문제풀이가 필요할 것 같다. 파이팅...🔥

 

 

 

 

 

참고한 블로그

https://velog.io/@effirin/Java-StringTokenizer%EC%99%80-Split-%EB%A9%94%EC%84%9C%EB%93%9C-%EC%96%B8%EC%A0%9C-%EC%8D%A8%EC%95%BC%ED%95%A0%EA%B9%8C

https://jie0025.tistory.com/496

반응형

'problem-solving' 카테고리의 다른 글

[BOJ] 17413: 단어 뒤집기2  (1) 2024.05.23
[BOJ] 1406: 에디터  (0) 2024.05.14