티스토리 뷰

 

 

 

문제

앞에서부터 읽을 때와 뒤에서부터 읽을 때 똑같은 단어 또는 문장을 팰린드롬(palindrome)이라고 합니다.

예를 들어서 racecar, noon은 팰린드롬 단어입니다.

소문자 알파벳, 공백(" "),그리고 마침표(".")로 이루어진 문장이 팰린드롬 문장인지 점검하려 합니다. 문장 내에서 알파벳만 추출하였을 때에 팰린드롬 단어이면 팰린드롬 문장입니다. 예를 들어, "Never odd or even."과 같은 문장은 팰린드롬입니다.

소문자 알파벳, 공백(" "),그리고 마침표(".")로 이루어진 문장 sentence가 주어질 때 팰린드롬인지 아닌지를 return하도록 solution함수를 작성했습니다. 그러나, 코드 일부분이 잘못되어있기 때문에, 몇몇 입력에 대해서는 올바르게 동작하지 않습니다.

주어진 코드에서 한 줄만 변경해서 모든 입력에 대해 올바르게 동작하도록 수정해주세요.

 

 

 

 

 

주어진 코드

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
bool solution(char* sentence) {
    char* str = (char*)malloc(sizeof(char) * 103);
    int len = 0;
    for (int i = 0; i < strlen(sentence); i++) {
        char ch = sentence[i];
        if (ch != ' ' || ch != '.') str[len++] = ch;
    }
    for (int i = 0; i < len / 2; i++) {
        if (str[i] != str[len - 1 - i]) return false;
    }
    return true;
}
int main() {
    char sentence1[19] = "never odd or even.";
    bool ret1 = solution(sentence1);

    printf("solution 함수의 반환 값은 %s 입니다.\n", ret1 == true ? "true" : "false");

    char sentence2[19] = "palindrome";
    bool ret2 = solution(sentence2);

    printf("solution 함수의 반환 값은 %s 입니다.\n", ret2 == true ? "true" : "false");
}

 

 

 

코드 분석/수정

단계 과정
main 팰린드롬인지 판별할 문자열을 입력한 후 solution함수를 호출한다.
solution 문자열의 길이가 입력한 값마다 다를 수 있기때문에, 동적할당(malloc)을 사용하여 str의 크기를 지정한다.
공백과 마침표가 아닌 문자의 개수를 저장할 변수 len을 선언한다.
for문 안에서 if(ch != ' ' || ch != '.')를 통해 공백과 마침표가 모두 아닐 때 str[len++] = ch를 실행해야 하는데, if(ch != ' ' || ch != '.')에서는 공백이 아니거나 마침표가 아닐 때(마침표가 있어도 실행되고, 공백이 있어도 실행됨) str[len++] = ch가 실행되므로 원하는 값을 얻을 수 없다. 
따라서 if(ch != ' ' && ch != '.')로 바꾼 후에 함수를 진행해야 한다.
(수정 후)
solution - for1 검사받는 문자가 공백과 마침표 모두 아닐 경우 str[len]에 그 문자를 넣은 후 len++을 진행한다.
이때 str은 팰린드롬인지 판별할 수 있는 온전히 문자로만 이루어진 값이 들어갈 배열이고,
len을 통해 str배열의 길이를 알 수 있다.
첫번째 for문이 종료되고 두번째 for문으로 넘어간다.
solution - for2 팰린드롬을 판별할 때에는 양쪽 끝에서부터 짝을 지어 서로 일치한지를 판단하는 방식을 사용한다. 
양쪽에서 짝을 짓기 때문에 for문은 str배열 길이의 절반만큼만 돌리면 된다.
이때 하나라도 값이 일치하지 않으면 false를 return하고, 모두 일치하면 for문을 종료하고 true를 return한다.
main true 또는 false를 출력한 후 프로그램이 종료된다.

 

 

 

 

 

 

 

고친 코드

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
bool solution(char* sentence) {
    char* str = (char*)malloc(sizeof(char) * 103);
    int len = 0;
    for (int i = 0; i < strlen(sentence); i++) {
        char ch = sentence[i];
        if (ch != ' ' && ch != '.') str[len++] = ch;
    }
    for (int i = 0; i < len / 2; i++) {
        if (str[i] != str[len - 1 - i]) return false;
    }
    return true;
}
int main() {
    char sentence1[19] = "never odd or even.";
    bool ret1 = solution(sentence1);

    printf("solution 함수의 반환 값은 %s 입니다.\n", ret1 == true ? "true" : "false");

    char sentence2[19] = "palindrome";
    bool ret2 = solution(sentence2);

    printf("solution 함수의 반환 값은 %s 입니다.\n", ret2 == true ? "true" : "false");
}

 

 


 

 

sentence return
"never odd or even" true
"palindrome" false

 

댓글