🙈

⃝ 동글동글 ⃝

🪐ᐩ˖ 🍎

카테고리 없음

[프로그래머스/Programmers] JadenCase 문자열 만들기 (Java - Lv2)

JONG_UK 2023. 1. 23. 18:18
728x90
반응형

 

 

프로그래머스

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

programmers.co.kr


⭐️ 코드

class Solution {
    public String solution(String s) {
        String answer = "";
        String[] sArr = s.toLowerCase().split(" ");
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < sArr.length; i++) {
            if (sArr[i].length() != 0) {
                sb.append(sArr[i].substring(0, 1).toUpperCase());
                sb.append(sArr[i].substring(1, sArr[i].length()));
            }
            sb.append(" ");
        }

        if(!(" ".equals(s.substring(s.length()-1, s.length())))) {
            sb.deleteCharAt(sb.lastIndexOf(" "));
        }

        return sb.toString();
    }
}

💡 문제 풀이

이 문제는 제한 조건을 잘 봐야 한다.

 

 

문제에서 공백문자는 연속해서 나올 수 있고, 마지막에 공백문자가 나올 수 있다는 것을 명심해야 한다.

 

우리는 split()과 substring() 메서드를 사용할 것이며, 잘 모른다면 아래 포스트를 보고 오자

 

 

[JAVA] 문자열을 배열로 자르는 메서드 split에 대해서 알아봅시다

안녕하세요 프로그래밍을 하다보면 문자열을 특정 기준에 따라 잘라서 보고 싶은 경우가 있습니다 그 경우 String 기본 메서드인 split를 사용하여 자를 수가 있습니다 이번 포스팅에서는 split에

crazykim2.tistory.com

 

[Java] 문자열 자르기 (substring)

Java에서 java.lang.String 클래스의 substring() 메소드를 사용하여 문자열을 자르는 방법을 소개합니다. 문자열 자르기 - substring() java.lang.String 클래스의 substring() 메소드는 문자열의 특정 부분을 잘라

hianna.tistory.com

 

먼저 split() 함수는 () 안에 지정한 문자를 기준으로 나누게 된다.

(" ") 라면 공백 한 칸 기준으로 나뉘게 되는데 제한 사항에서  공백은 여려 개가 올 수 있다고 한다.

그렇다면 "  " 2칸의 공백은 " " 한 칸의 공백으로 split 하게 되면 split을 수행한 String 배열에 "" 공백이 삽입된다. 

 

"3people Unfollowed Me"를 공백을 한 칸씩 추가하여 split(" ")을 수행하게 되면 아래와 같이 출력된다.

 

"3people  Unfollowed  Me"

따라서 이번 문제에서는 위 사례를 생각하고 풀어야 한다.

 

String[] sArr = s.toLowerCase().split(" ");

먼저 JadenCase는 맨 처음 글자가 대문자이고, 이후의 이어지는 글자는 소문자여야 하기 때문에 모두 LowerCase() 메서드로 소문자화 해주고 시작한다.

 

StringBuilder sb = new StringBuilder();

문자열의 연산이기 때문에 StringBuilder() 내장함수를 이용해 주면 더 빠르기 때문에 StringBuilder를 사용하고 아래 연산을 수행해 보자.

 

for (int i = 0; i < sArr.length; i++) {
    if (sArr[i].length() != 0) {
        sb.append(sArr[i].substring(0, 1).toUpperCase());
        sb.append(sArr[i].substring(1, sArr[i].length()));
    }
    sb.append(" ");
}

sArr 배열에서 공백이 있다면 문자열에서 공백이 두 번 연속으로 있었다는 뜻이며, sArr [i]의 length는 0이 되는 경우다. 공백이 두 개가 나왔으니까 완성될 문자열에 sb.append(" ");로 공백을 한 칸 추가해 준다.

 

그 후 sArr [i]가 0이 아닌 경우에 첫 글자를 대문자로 바꾸는 연산을 하면 된다.

 

간단하게 substring() 메서드를 이용하여 연산을 해주면 되고, 마지막에 띄어쓰기를 한 칸씩 하기 때문에 띄어쓰기용 공백을 한 칸 추가해 준다.

 

완성된 문자열은 맨 뒤에 공백이 한 칸 삽입되어 있을 것이다.

 

따라서 마지막의 공백은 제거해 주는 연산을 하면 되는데 

if(!(" ".equals(s.substring(s.length()-1, s.length())))) {
    sb.deleteCharAt(sb.lastIndexOf(" "));
}

실제 문자열에서 마지막에 공백이 있었는지를 체크한 다음 공백 제거를 진행할지 말지 결정해야 한다. 그래서 위의 식을 꼭 넣어서 수행해 줘야 한다. 

 

 

실패 코드
String[] sArr = s.split(" ");
System.out.println(Arrays.toString(sArr));
StringBuilder sb = new StringBuilder();
for(int i = 0; i<sArr.length; i++) {
    char c = sArr[i].charAt(0);
    // 첫 글자가 숫자일 때
    if (c < 'a' || c == ' ') {
        sArr[i] = sArr[i].toLowerCase();
        sb.append(sArr[i]);
    }
    // 첫 글자가 문자일 때
    else if (('A' < c && c > 'Z') || ('a' < c && c > 'z')) {
        sArr[i] = sArr[i].toLowerCase();
        sb.append(sArr[i].substring(0, 1).toUpperCase());
        sb.append(sArr[i].substring(1, sArr[i].length()));
    }
    if(i < sArr.length-1 ){
        sb.append(" ");
    }
}
return sb.toString();

👀 후기

제한 조건을 꼭 잘 보자...

안 보고 막 풀다 하나 막히니까 너무 돌아가게 된다...

728x90
반응형