본문 바로가기
코딩테스트/C언어

[Level1] 이상한 문자 만들기 답안 및 풀이

by SRin23 2021. 6. 8.

◇ 문제 설명

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

 

◇ 제한 조건

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

 

◇ 입출력 예시

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

 

◇ 예시 설명

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

 

◇ 초기 내용

※ [출처] 프로그래머스-코딩테스트 연습-문제명

※ 초기 내용을 참고하여 문제에 맞는 코드를 작성하세요.

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

// 파라미터로 주어지는 문자열은 const로 주어집니다. 변경하려면 문자열을 복사해서 사용하세요.
char* solution(const char* s) {
    // return 값은 malloc 등 동적 할당을 사용해주세요. 할당 길이는 상황에 맞게 변경해주세요.
    char* answer = (char*)malloc(1);
    return answer;
}

 


◇ 답안

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

char* solution(const char* s) {
     char* answer = (char*)malloc(sizeof(char) * strlen(s));
    int cnt = 0;
    char* str = s;
    
    for(int i = 0; i<strlen(s); i++){
        if(str[i] >= 'A' && str[i]<= 'Z'){
            str[i] = str[i] + 32;
        }
    }
    

    for (int i = 0; i < strlen(s); i++) {
        if (str[i] == ' ') {
            cnt = 0; continue;
        }
        if (cnt % 2 == 0) {
            //대문자
            str[i] = str[i] - 32;
            cnt++;
        }
        else {
            //소문자
            cnt++;
        }
    }
    answer = str;
    return answer;
}

 

◇ 답안 힌트

    ▶ s에는 소문자와 대문자가 섞여 있습니다. s 전체를 소문자 혹은 대문자로 완전히 바꿔주세요.

    ▶ 빈공백 문자(' ')를 만나면 str을 세는 변수는 0이됩니다.

    아스키 코드 : (소문자) - (대문자) = 32이므로 소문자 - 32 = 대문자를 나타냄

 

◇ 답안 풀이

(※ 실행 흐름 순으로 해석됩니다.)

char* solution(const char* s) {

    //s의 길이만큼 메모리 할당
     char* answer = (char*)malloc(sizeof(char) * strlen(s) );

    //str의 각 '단어'의 문자에 대한 위치를 나타낼 변수
    int cnt = 0;

    //s는 상수이므로 str변수에 s를 저장하여 선언
    char* str = s;

 

    //만약, str[i]가 대문자이면 소문자로 변환 -> 모든 str의 값을 소문자로 변환

    for(int i = 0; i<strlen(s); i++){
        if(str[i] >= 'A' && str[i]<= 'Z'){
            str[i] = str[i] + 32;
        }
    }

    for (int i = 0; i < strlen(s); i++) {

        //만약, str[i]의 값이 ' '공백 문자이면 cnt를 0으로 초기화 한 후, 아래 내용을 수행하지 않음

        //ex. str = good day(아래 참조)

str[i] 'g' 'o' 'o' 'd'   'd' 'a' 'y'
i 0 1 2 3 4 5 6 7
cnt 0 1 2 3 0 0 1 2

        if (str[i] == ' ') {
            cnt = 0; continue;
        }

 

        //만약, cnt(각 단어에 따른 문자 위치)가 짝수이면 소문자(위에서 모든 값을 소문자로 변환함)를 대문자로 변환

       // 아스키 코드 : (소문자) - (대문자) = 32이므로 소문자 - 32 = 대문자를 나타냄

       //단어 위치 +1
        if (cnt % 2 == 0) {
            //대문자
            str[i] = str[i] - 32;
            cnt++;
        }

 

        //만약, cnt(각 단어에 따른 문자 위치)가 홀수이면 원래 소문자 이므로 값을 변환할 필요 없음

        //단어위치 +1
        else {
            //소문자
            cnt++;
        }
    }

 

    //answer에 str값 대입
    answer = str;
    return answer;
}

 

 

◇ 실행결과

이상한 문자 만들기 실행 결과

 

◇ 출처

https://programmers.co.kr/learn/challenges

 

코딩테스트 연습

기초부터 차근차근, 직접 코드를 작성해 보세요.

programmers.co.kr

 

댓글