티스토리 뷰
문제
앞에서부터 읽을 때와 뒤에서부터 읽을 때 똑같은 단어 또는 문장을 팰린드롬(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 |
'[코테] > [GroomEdu]' 카테고리의 다른 글
[COS PRO 2급] 10번_평균 이하의 개수 구하기 (C/C++) (0) | 2021.05.07 |
---|---|
[COS PRO 2급] 9번_중복문자 삭제하기 (C/C++) (0) | 2021.05.07 |
[COS PRO 2급] 7번_영어 수강 대상자 수 구하기 (C/C++) (0) | 2021.05.06 |
[COS PRO 2급] 5번_배열의 순서 뒤집기 (C/C++) (0) | 2021.05.05 |
[COS PRO 2급] 6번_369게임 박수의 개수는? (C/C++) (1) | 2021.05.05 |
댓글
공지사항
최근에 올라온 글
TAG
- 구름 기출문제
- cospro기출
- C++
- 연습문제
- c언어 기출문제
- COSPRO 2급
- lv2
- 배열활용문제
- 자바
- C
- c언어
- 코딩테스트
- 알고리즘
- cospro기출문제
- 코스프로
- lv1
- Java
- groom
- 배열
- 프로그래머스
- 기출문제
- 구름에듀 기출문제
- programmers
- YBM기출
- CosPro
- Cos Pro
- 구름에듀
- YBM
- 1급
- groomedu
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
글 보관함