관리 메뉴

JIE0025

[연습문제][lv.2] JadenCase 문자열 만들기 - 자바(Java) 본문

알고리즘/프로그래머스

[연습문제][lv.2] JadenCase 문자열 만들기 - 자바(Java)

Kangjieun11 2023. 4. 12. 22:06
728x90

 
 
문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/12951

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 
 


 

문제

문제 설명

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

제한 조건

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

 
입출력 예

sretun
"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