Cospro 2급/C언어

[1차] 문제 8. 팰린드롬 판단하기 풀이 및 해석

SRin23 2021. 5. 6. 19:38

■ 문제설명

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

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

 

소문자 알파벳, 공백(" "), 그리고 마침표(".")로 이우러진 문장 sentence가 주어질때 팰린드롬인지 아닌지를 return하도록 solution함수를 작성했습니다. 

 

그러나, 코드 일부분이 잘못 되어있기 때문에, 몇몇 입력에 대해서는 올바르게 동작하지 않습니다. 주어진 코드에서 한 줄만 변경해서 모든 입력에 대해 올바르게 동작하도록 수정해주세요.

 

■ 매개변수 설명

소문자 알파벳, 공백(" "), 그리고 마침표(".")로 이우러진 문장 sentence가 solution 함수의 매개변수로 주어집니다. 

 → sentence의 길이는 1이상 100이하입니다.

 → sentence에는 적어도 하나의 알파벳이 포함되어 있습니다. 

 → sentence의 각 문자는 소문자 알파벳, 공백(" "), 또는 마침표(".")입니다.

 

■ return값 설명

주어진 문장이 팰린드롬인지 아닌지를 return해주세요.

 

■ 예시

sentence return
"never odd or even" true
palindrome false

 

■ 예시 설명

예시 #1

알파벳과 숫자만 추출하여 소문자로 변환해보면 "neveroddoreven"이 되며, 이 단어는 팰린드롬입니다.

예시 #2

문장의 맨 앞 문자인 "p"와 맨 뒤 문자인 "e"가 다르므로 팰린드롬이 아닙니다.

 

■초기내용

[출처]goormedu COSPRO 2급 기출문제 1차 - 8번 초기 내용

위 내용을 바탕으로 solution함수 내의 틀린 부분을 찾아 알맞게 실행되도록 코드를 고쳐야 한다.

 

■ 답안

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

bool solution(char* sentence) {	
    char *str = (char *)malloc(sizeof(char) * 103);
    int len = 0;
	int tmp = 0;
    for(int i = 0; i < strlen(sentence); i++){
        char ch = sentence[i];
        if(ch != ' ' && ch != '.') str[len++] = ch;
			  //if(ch==' '||ch == '.') tmp++;
    }
	  //printf("%d", len);
	  //printf("%d", tmp);
    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");
}

 

■답안 풀이 및 해석

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

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변수에 문자열 저장

//ret에 solution에서 반환된 boolean값 저장

//printf()함수를 통해 결과 출력

 

bool solution(char* sentence) {
    char *str = (char *)malloc(sizeof(char) * 103);
    int len = 0;
    //int tmp = 0;


    for(int i = 0; i < strlen(sentence); i++){
        char ch = sentence[i];
        if(ch != ' ' && ch != '.') str[len++] = ch;
        //if(ch==' '||ch == '.') tmp++; 
//공백과 마침표의 개수
    }
  //printf("%d", len);
//저장된 len의 값
  //printf("%d", tmp);
//저장된 공백과 마침표의 개수


    for(int i = 0; i < len / 2; i++){
        if(str[i] != str[len - 1 - i]) return false;
    }
    return true;
}

// malloc()함수를 이용하여 103byte의 메모리를 str포인터 변수가 할당받음

// len을 0으로 초기화

// 첫번째 for문을 이용하여 sentence의 길이만큼 반복

// ch에 sentence를 순서대로 넣고, 만약 ch가 공백 혹은 마침표가 아니면 할당받은 str변수에 0부터 순서대로 ch값 저장

// ch != ' ' || ch != '.'이면 공백, 마침표여도 if문 안의 문장을 실행하여 len이 ++되므로 &&로 변환

// 두번째 for문을 이용하여 처음-맨끝/처음+1-맨끝-2 ....의 순으로 앞뒤 비교(한번이라도 다르면 false반환)

 

[참고]----------------------------------------------

※ &&연산자는 하나라도 false면 false를 반환

true && true   => true

true && false  => false

false && true  => false

false && false  => false

 

※ || 연산자는 하나라도 true면 true를 반환

true || true  => true

true || false  => true

false || true  => true

false || false  => false

----------------------------------------------------

 

■실행 결과

문제 8. 팰린드롬 판단하기 답안

 

https://edu.goorm.io/learn/lecture/16921/cos-pro-2%25EA%25B8%2589-%25EA%25B8%25B0%25EC%25B6%259C%25EB%25AC%25B8%25EC%25A0%259C-c%25EC%2596%25B8%25EC%2596%25B4

 

COS PRO 2급 기출문제 - C언어 - 구름EDU

YBM IT에서 시행하는 COS Pro 자격증 기출문제를 직접 풀어볼 수 있는 실습 위주의 강좌입니다.

edu.goorm.io