본문 바로가기

코딩 테스트

[프로그래머스] (Lv.2) JadenCase 문자열 만들기 ***

728x90

문제


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

 

제한 조건

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

 

-  출력 예시  -

정답 코드


<  내 정답 코드  >       ★   오답   ★ 

class Solution {
    public String solution(String s) {
        String[] strArr = s.split(" ", -1);
        // if (s.substring(s.length() - 1, s.length()).equals(" ")) {
        //     strArr[strArr.length - 1] += " ";
        // }
        String answer = "";

        for (int i = 0; i < strArr.length; i++) {
            String word = "";
            for (int j = 0; j < strArr[i].length(); j++) {
                if (j == 0 && 'a' <= strArr[i].charAt(j) && strArr[i].charAt(j) <= 'z') {
                    word += Character.toUpperCase(strArr[i].charAt(j));
                } else if ('A' <= strArr[i].charAt(j) && strArr[i].charAt(j) <= 'Z') {
                    word += Character.toLowerCase(strArr[i].charAt(j));
                } else {
                    word += strArr[i].charAt(j);
                }
            }
            strArr[i] = word;
        }

        answer += strArr[0];

        for (int i = 1; i < strArr.length; i++) {
            answer += " " + strArr[i];
        }

        return answer;
    }
}

 

<  내 정답 코드  > 

class Solution {
    public String solution(String s) {
        String[] strArr = s.split("");

        String answer = "";

        answer = strArr[0].toUpperCase();

        for (int i = 1; i < strArr.length; i++) {
            if (strArr[i - 1].equals(" ")) {
                answer += strArr[i].toUpperCase();
            } else {
                answer += strArr[i].toLowerCase();
            }
        }

        return answer;
    }
}

 

<  타인 답변 코드  >

class Solution {
    public String solution(String s) {
        String result = "";
        String[] strArr = s.toLowerCase().split("");
        boolean isTrue = true;

        // for문을 통해서 이전에 공백이 있으면 해당 문자를 대문자로 변경한다.
        for (String str : strArr) {
            result += isTrue ? str.toUpperCase() : str;
            isTrue = str.equals(" ") ? true : false;
        }

        // String으로 만든다.
        return result;
    }
}

이것을 주의하자!


-  정말 시간이 많이 걸린 문제다. 일단 오답 코드에서 틀린 이유는 split("  ") 메서드를 통해 '공백'을 기준으로 단어를 나눴기 때문이다. 문제 예시를 보면 누가 봐도 공백을 기준으로 나눈 다음 charAt( ) 메서드로 앞 글자만 대문자로 바꿔주면 될 것 같다. 하지만 이것이 이 문제의 함정이다!! 

 

 

다시 말해 공백도 '문자' 취급을 해야했다. 그러나 split("  ") 메서드를 사용하면 공백을 기준으로 나누기 때문에 올바른 값이 나올수 없었다. 따라서 정답으로 향하는 길은 '공백'까지 문자 취급해주는 split("") 메서드이다.

 

split("") 메서드를 통해 공백을 포함한 모든 문자열을 String 배열로 만든다. 이후엔 내 정답 코드나 타인 답변 코드와 같이 다른 스타일로 풀 수 있다. 내 경우엔 단어의 맨 앞자리만 대문자로 바꿔야 하기에 for 문을 사용해서 해당 자리 앞에 공백인 경우에만 대문자로 바꿨고, 나머지는 소문자로 바꿨다. 

 

-  타인 답변 코드에선 boolean 변수를 통해서 자기 자리가 공백인 경우에만 true 값을 주고 나머지는 false 값을 줘서 공백 다음에 오는 문자만 대문자로 변경하도록 했다.

 

-  이 문제는 "공백을 어떻게 처리할 것인가"에 대한 물음이다. 즉 split( ) 메서드를 사용하는 방법에 대해 묻는 것이다.