[연습문제] 이상한 문자 만들기

2024. 11. 12. 18:00입문문제

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

 

프로그래머스

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

programmers.co.kr


문제 설명
문자열 s는 한 개 이상의 단어로 구성되어 있습니다.

각 단어는 하나 이상의 공백문자로 구분되어 있습니다.

각 단어의 짝수번째 알파벳은 대문자로, 홀수번째 알파벳은 소문자로 바꾼 문자열을 리턴하는 함수, solution을 완성하세요.


제한 사항

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

입출력 예

s return
"try hello world" "TrY HeLlO WoRlD"

입출력 예 설명
"try hello world"는 세 단어 "try", "hello", "world"로 구성되어 있습니다.

각 단어의 짝수번째 문자를 대문자로, 홀수번째 문자를 소문자로 바꾸면 "TrY", "HeLlO", "WoRlD"입니다.

따라서 "TrY HeLlO WoRlD" 를 리턴합니다.


1개 이상의 단어들로 이루어진 문자열이 주어질 때, 각 단어들의 짝수번째 인덱스는 대문자로, 홀수번째 인덱스는 소문자로 변경하는 문제입니다.

각 단어별로 적용되기 때문에 "hello world" 같은 경우는 "HeLlO WoRlD"가 되는 거죠.

다만 공백 부분은 항상 그대로 유지해야 됩니다.

 

C언어를 사용한다면 strtok 함수를 사용해 문자열을 토큰화할 수 있지만, 공백 처리 부분에서 어떻게 될지 몰라서 이 부분은 반복문을 사용해 문제를 풀어보겠습니다.

파이썬은 split 함수를 사용해 토큰화된 문자열들을 처리하는 방법으로 진행해보고요.

 

정답 코드를 작성해보겠습니다.

 

1. C

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

char* solution(const char* s) {
    // 문자열의 길이를 가져옵니다.
    int len = strlen(s);
    // 길이에 맞도록 answer 배열을 선언합니다.
    char* answer = (char*)malloc(sizeof(char) * (len + 1));
    answer[len] = '\0';
    
    // 인덱스의 위치를 셀 idx
    int idx = 0;
    // 반복문을 사용합니다.
    for (int i=0; i < len; i++) {
        // i번째가 공백일 경우
        if (s[i] == ' ') {
            idx = 0; // 인덱스 초기화
            answer[i] = ' '; // 공백 추가
        }
        else {
            if (idx % 2 == 1) { // 홀수번째 인덱스일 경우
                answer[i] = tolower(s[i]);
            }
            else { // 짝수번째 인덱스일 경우
                answer[i] = toupper(s[i]);
            }
            // 인덱스를 1씩 증가시킵니다.
            idx++;
        }
    }
    // answer을 반환합니다.
    return answer;
}

 

C언어에서는 toupper, tolower을 사용하지 않고 직접 구현할 수도 있지만, 굳이 그럴 필요는 없다고 생각했습니다.

이 두 함수를 사용하기 위해서는 ctype.h 헤더 파일을 불러와야 합니다.

 

2. 파이썬

def solution(s):
    answer = ''
    # 문자열 s를 공백을 기준으로 분리합니다.
    for st in s.split(' '):
        # 단어 st를 기준으로 변환합니다.
        for i, c in enumerate(st):
            # 인덱스가 홀수라면
            if i % 2:
                answer += c.lower()
            # 인덱스가 짝수라면
            else:
                answer += c.upper()
        answer += ' '
    return answer[:-1]

 

파이썬을 사용하실 때 중요한 점은 split 함수에 ' '을 명시해주는 것입니다.

split 함수를 기본형으로 사용하시면 연속되는 공백을 하나의 단어로 취급하게 됩니다.

따라서 "  TRy HElLo  WORLD "의 경우를 "TrY HeLlo WoRlD"로 변환시키죠.

 

하지만 ' '이라고 명시를 해준다면 공백 하나당을 기준으로 문자열을 분리해주기 때문에, 이 문제에서 벗어날 수 있습니다.