[프로그래머스/C++] ㅡ LV1 - 이상한 문자 만들기

2021. 3. 27. 15:43필요/코딩테스트(프로그래머스)

문제

programmers.co.kr/learn/courses/30/lessons/12930

 

코딩테스트 연습 - 이상한 문자 만들기

문자열 s는 한 개 이상의 단어로 구성되어 있습니다. 각 단어는 하나 이상의 공백문자로 구분되어 있습니다. 각 단어의 짝수번째 알파벳은 대문자로, 홀수번째 알파벳은 소문자로 바꾼 문자열을

programmers.co.kr

풀이

#include <string>
#include <vector>

using namespace std;

string solution(string s) {
    string answer = "";
    bool ifEven = true;		// 짝수인 경우
    for (int i=0; i<s.size(); i++) {
        if(s[i]!=' ') {	// 공백이 아닌 경우
            if (s[i] < 'a') {	// 대문자인 경우
                if (ifEven) {
                    answer+=s[i];
                }
                else {
                    answer+=s[i]+32;
                }
            }
            else {	// 소문자인 경우
                if (ifEven) {
                    answer+=s[i]-32;
                }
                else {
                    answer+=s[i];
                }
            }
            ifEven=!ifEven;
        }
        else {	// 공백인 경우
            answer+=s[i];
            ifEven = true;
        }
    }
    return answer;
}

풀이

문제에서 말해주지 않은 것이 있다.

예제로는 소문자만 있지만, Testcase에는 대문자도 동시에 나타난다.

따라서 if문을 한번 더 사용해줘야한다.

이때 지난번 문제인 시저암호 문제를 해결한 방법과 동일한 방식을 사용했다.

 

문제에서 나눠야하는 케이스는

1. 공백

2. 소문자

3. 대문자

 

이며 2, 3에서 각각의 단어안에서 숫자를 세어 짝수->대문자, 홀수->소문자로 변환해야한다.

 

숫자를 세는 것이 불필요하다 생각이 들어 bool 변수인 ifEven을 사용했다.

그리고 단어안에서 다음 문자로 넘어갈 때 ifEven = !ifEven 을 사용해 true->false, false->true로 변환해주었다.

 

또한 공백시 ifEven의 값을 초기화하는 방법을 사용했는데, 공백이 연속으로 나오는 경우에도 대비할 수 있다.