[JAVA] [LEVEL2] 프로그래머스 - JadenCase 문자열 만들기

반응형

프로그래머스 programmers Level2 JadenCase 문자열 만들기 - java 자바

[문제]

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

 

프로그래머스

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

programmers.co.kr

 

[풀이]

 ※ 문제 : JadenCase란 모든 단어의 첫 문자가 대문자이고, 그 외의 알파벳은 소문자인 문자열입니다. 

처음 문제를 풀었을때, 제한사항을 주의깊게 읽지 않아 공백이 여러개 올 수 있다는 사실을 간과했다.

다음의 경우를 고려해야한다.

  1. 문자열이 공백으로 시작하는 경우
  2. 문자열 사이에 공백이 2개이상 존재하는 경우
  3. 문자열이 공백으로 끝나는 경우

 

처음에 s.split(" ") 을 이용해서 공백으로 문자열을 잘라서 확인하니, 여러 공백케이스를 생각해야해서 고민이 됐다.

s.split(" ") 으로 할 경우, 마지막 공백을 알 수 없다.

s.split(" ", -1) 로 할 경우, 마지막 공백은 알 수 있지만, 중간에 나오는 공백으로 하나씩 잘려있다.

※ s.split(" ") 와 s.split(" ", -1) 의 차이

 

[java] String - split() 사용법

문자열 String 을 특정 문자로 자를때 사용할 수 있는 메소드가 split() 이다. 공백으로 문자열을 자를때, split(" ") 으로 자르면 되지만, 문자열이 끝나고 마지막에 붙는 공백은 얻어지지 않는다. 파

gymdev.tistory.com

그래서 공백으로 자르지 않고, 모든 글자를 하나씩 잘라서 확인했다.


사실 boolean 으로 플래그 변수를 이용하는 것이 좋다고 할수는 없지만, 그 방법을 사용했다.

  1. 모든 문자를 소문자로 변환해둔다.
  2. ""으로 모든 글자를 하나씩 잘라서 배열을 생성한다.
  3. 생성된 배열을 for 문으로 하나씩 확인하며
    3.1. 공백이면 답안에 공백을 추가하고 다음에 오는 문자는 대문자가 될것이므로 isFirst 플래그를 true로 해준다.
    3.2. 공백 다음으로 첫 문자가 오면 (isFirst = true) 대문자로 넣고, 다음은 첫 문자가 아니므로 isFirst 플래그를 false 로 해준다.
    3.3. 문자 다음 문자열이면 (isFirst = false) 소문자 넣는다.

 

[java 코드]

/**
 * JadenCase 문자열 만들기
 * @param s 문자열, 공백으로 구분된 단어, 공백 연속 가능성 있음
 * @return s를 JadenCase 로 바꾼 문자열
 * JadenCase : 모든 단어의 첫 문자가 대문자이고, 그 외의 알파벳은 소문자인 문자열
 */
public String solution(String s) {
    String answer = "";
    StringBuilder sb = new StringBuilder();
    // 첫글자만 대문자이므로 전체를 소문자로 변환해둔다.
    s = s.toLowerCase();
    String[] strings = s.split("");
    // 대문자로 바꾸기
    boolean isFirst = true;
    for (String str : strings) {
        // 공백인경우
        if (BLANK.equals(str)) {
            sb.append(BLANK);
            isFirst = true;
            continue;
        } else {
            // 공백이 아니면 첫글자만 대문자
            if (isFirst) {
                sb.append(str.toUpperCase());
                isFirst = false;
            } else {
                sb.append(str);
            }
        }
    }
    answer = sb.toString();
    return answer;
}
반응형