C#/프로그래머스 코딩 문제 풀이

[프로그래머스 C#] Lv.2 JadenCase 문자열 만들기

ForMan_ 2024. 5. 21. 15:52

1. 문제설명

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

2. 제한사항

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

3. 입출력 예시

s return
"3people unFollowed me" "3people Unfollowed Me"
"for the last week" "For The Last Week"

4. 나의풀이

  • 첫 번째 시도(실패)
    - Split(' ')을 사용해 s를 공백을 기준으로 나눠 string배열에 담음.
    - 첫 문자만 ToUpper해주고 나머지는 전부 ToLower해줘서 answer에 넣어줌.
    - 런타임 에러 발생! >>> 제한사항에서 공백문자가 연속해서 나올 수 있다고 함. 한 개의 공백을 기준으로 나눴기 때문에 공백 문자가 2개 이상 이어져있다면 string배열에 공백도 담기게 됨.

  • 두 번째 시도(성공)
    - Split이 아니라 공백을 찾고 그 다음에 공백이 아닌 문자가 오면 ToUpper해주는 형식.
    - bool을 사용해 대문자로 만들건지 아님 그냥 추가할건지 판별.
    - 한 번 놓친 포인트! >>> 입출력 예시처럼 문자열 사이에 있는 공백은 기존의 s에 원래부터 있던 공백임. 그러니 문자 사이에 공백이 한 개이든 두 개이든 100개이든 전부 추가해줘야 됨. 대문자로 변경한 문자를 answer에 넣기 전에 공백 하나만 넣어주면되는 것이 아니었음.
public string solution(string s)
    {
        string answer = "";

        // 전부 소문자로 변경.
        s = s.ToLower();

        // 대문자로 바꿔도 되는지 판단할 변수. 
        // 첫 문자가 공백이 아니라면 대문자로 변경해줘야하니 처음은 true.
        bool isTryUpper = true;

        for (int i = 0; i < s.Length; i++)
        {
            // 이번 문자가 공백이라면 answer에 넣어주고 isTryUpper는 true로 변경.
            // true시킨 후 공백문자가 다음 if문을 갈 수 있기 때문에 continue.
            if (s[i] == ' ')
            {
                answer += ' ';
                isTryUpper = true;
                continue;
            }

            // 대문자로 변경시킬 문자라면 변경해주고 answer에 추가.
            // 이어지는 문자는 대문자로 변경시키면 안되기 때문에 isTryUpper는 false로 변경.
            if (isTryUpper == true)
            {
                char ch = char.ToUpper(s[i]);
                answer += ch;
                isTryUpper = false;
            }
            else
            {
                // 대문자로 변경시킬 문자가 아니라면 바로 answer에 추가.
                answer += s[i];
            }
        }

        return answer;
    }