코딩테스트 연습에 공개된 문제는 (주)그렙이 저작권을 가지고 있습니다.
(지문 하단에 별도 저작권 표시 문제 제외)
코딩테스트 연습 문제의 지문, 테스트케이스, 풀이 등과 같은 정보는 비상업적, 비영리적 용도로 게시할 수 있습니다.

문제 정보

문제

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public String solution(String s) {
    
    String answer = "";
    String[] sArray = s.split("");
    int nextIsUpperFlag = 1;

    for (int i = 0; i < sArray.length; i++) {
        if (sArray[i].equals(" ")) {
            // 공백이면 flag를 1로 변환하고 pass 한다.
            nextIsUpperFlag = 1;
            answer += sArray[i];
        } else if (nextIsUpperFlag == 1) {
            // 공백이 아니고 flag가 1이면 문자를 uppercase로 변환하고 flag를 0으로
            nextIsUpperFlag = 0;
            answer += sArray[i].toUpperCase();
        } else {
            // 공백이 아니고 flag가 0이면 lowercase로 변환한다.
            answer += sArray[i].toLowerCase();
        }
    }
    
    return answer;
}

다른 풀이 코드

풀이 코드 중, 풀이 방식은 비슷하나 삼항연산자를 이용해 짧게 작성한 코드가 있어 첨부한다.

1
2
3
4
5
6
7
8
9
10
11
12
public String solution(String s) {
        String answer = "";
        String[] sp = s.toLowerCase().split("");
        boolean flag = true;

        for (String ss : sp) {
            answer += flag ? ss.toUpperCase() : ss;
            flag = ss.equals(" ") ? true : false;
        }

        return answer;
    }

풀이 방식

flag 이용
코드 참조

문자 다루기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// 문자를 나누기 : split()
String testString = "Hello World!";
System.out.println(Arrays.toString(testString));
>> [H, e, l, l, o,  , W, o, r, l, d, !]

// 영문자를 대문자로 변경 : toUpperCase()
//   -- 공백, 숫자, 한글 등에도 사용 가능하나 변화는 없다.
String testString = "Hello World!";
System.out.println(testString.toUpperCase());
>> "HELLO WORLD!"

// 영문자를 소문자로 변경 : toLowerCase()
//   -- 공백, 숫자, 한글 등에도 사용 가능하나 변화는 없다.
String testString = "Hello World!";
System.out.println(testString.toLowerCase());
>> "hello world!"

// 문자가 같은지 비교 : equals()
System.out.println("abc".equals("abc"));
>> True

// 문자열 양 끝의 공백 제거 : strip()
System.out.println(" Hello World! ".strip());
>> "Hello World!"

// 배열 문자화 : Arrays.toString()
String testString = "Hello World!";
System.out.println(Arrays.toString(testString));
>> [H, e, l, l, o,  , W, o, r, l, d, !]

리뷰

처음엔 문장을 공백 기준으로 나눈 뒤 나눠진 각 단어들을 대문자처리 후 공백을 사이사이에 끼워 붙여줬다. 그리고 마무리는 strip()으로 양 끝의 공백을 제거해줬다. 그런데 이게 문제였다.

테스트케이스 8번의 경우 문자열 앞 뒤로 공백이 있는데, 이 공백은 보존해줘야 하기 때문에 strip()을 사용하면 오답이 되어버린다. 때문에 문제 해결 방식을 바꾸어 각 문자를 검사하는 방식으로 바꾸었다.

Reference

대문자 소문자 전환 : https://pridiot.tistory.com/24
문자열 자르기 split : https://jamesdreaming.tistory.com/84
배열 길이 : https://mine-it-record.tistory.com/126
문자열 공백 제거 : https://hianna.tistory.com/526
특정 문자 포함 여부 : https://hianna.tistory.com/539
배열 값 출력하기 : https://hianna.tistory.com/510