Code KATA/알고리즘 코드카타

[2025.01.11] 이상한 문자 만들기

iiblueblue 2025. 1. 10. 11:23

문제 설명

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

 

 

제한사항

  • 문자열 전체의 짝/홀수 인덱스가 아니라, 단어(공백을 기준)별로 짝/홀수 인덱스를 판단해야합니다.
  • 첫 번째 글자는 0번째 인덱스로 보아 짝수번째 알파벳으로 처리해야 합니다.

 

 

입출력 예

s return 설명
"try hello world" "TrY HeLlO WoRlD" "try hello world"는 세 단어 "try", "hello", "world"로 구성되어 있습니다. 각 단어의 짝수번째 문자를 대문자로, 홀수번째 문자를 소문자로 바꾸면 "TrY", "heLlO", "WoRlD"입니다. "TrY HeLlO WoRlD"를 리턴합니다.

 

 

문제 풀이

풀이 언어 : C++

#include <string>
#include <vector>

using namespace std;

string solution(string s) {
    string answer = "";
    int index=0; // 단어별 인덱스
    
    for(int i=0; i<s.length(); i++)
    {
        // 바로 전 문자가 공백이라면 i는 다른 단어의 시작
        if(s[i-1]==' ')
        {
            index=0; // 단어별 인덱스 초기화
        }
        
        // 짝/홀수에 따라 대문자 소문자로 변환
        if(index%2==0) answer+=toupper(s[i]); // 짝수
        else answer+=tolower(s[i]); // 홀수
        
        // 단어별 인덱스 업데이트
        index++;
    }
    return answer;
}

문자열의 짝수 홀수를 구분하는 건 어렵지 않다. 짝수, 홀수 문제는 너무 많이 봐왔기 때문에. 하지만 문제가 있다면 단어별로 분리해서 생각해야 한다는 것이다. 공백이 나오면 하나의 단어가 끝났음을 알아야 하고 그러면 짝수, 홀수의 기준을 초기화 시켜줘야 한다.

 

그래서 단어별 인덱스를 만들었다. index는 0으로 초기화 해주고 반복문을 시작한다. 반복문을 안에는 두 가지 행동이 들어간다. 첫째로 지금 i번째 문자가 새로운 단어의 시작인지 확인하는 일이다. 바로 이전 문자가 공백이라면 지금 확인하고 있는 문자는 새로운 단어의 시작이므로 단어별 인덱스 index는 0으로 초기화시켜 주어야 한다.

 

두 번째 행동은 짝수인지 홀수인지 확인하고 대문자, 소문자로 변환해주는 것이다. 단어별로 짝수, 홀수를 판단해야 하기 때문에 기준은 i가 아니라 index가 된다. index가 짝수라면 toupper() 함수를 이용하여 문자를 대문자로 만들어주고 index가 홀수라면 tolower를 이용하여 문자를 소문자로 만들어 준다.

 

마지막으로 index를 하나 증가하여 업데이트 시켜주면 모든 반복문을 돌았을 때 answer에 이상한 문자열이 완성되게 된다.

 

참고사항

toupper(int c) 함수는 문자를 대문자로 변환하고 tolower(int c) 함수는 문자를 소문자로 반환한다.

if(index%2==0) answer+=toupper(s[i]); // 짝수
else answer+=tolower(s[i]); // 홀수

<cctype>를 스크립트 앞에 전처리기로 선언해주어야 사용할 수 있는다고 되어 있는데 문제풀이를 할 때 그거 없이도 잘 동작하였다. 이는 컴파일러와 헤더 파일의 암시적 포함 방식 때문일 가능성이 높다. <string> 등에 간접적으로 포함되어 잇을 가능성이 있다고 한다. <cctype> 라이브러리의 함수임을 기억하자.

 

toupper과 tolower은 int타입을 반환한다. 반환값은 입력된 문자의 ASCII 코드 값을 변환한 결과이다. 위 코드에서 그럼에도 string형인 answer에 아무말 없이 들어가준 이유는 암묵적 형번환이 일어났기 때문이다.

 

 

 

오답 노트

문자열 전체에서 인덱스의 홀짝을 계산해서 오답이 나왔다.

 

 

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/12930

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr