C언어 회문판별 질문..

조회수 2528회

표준 입력으로 공백이 포함된 길이 30 이하의 영문 문자열이 입력됩니다(공백이 여러 개 연속될 수도 있습니다). 입력된 문자열이 회문이면 1, 회문이 아니면 0을 출력하는 프로그램을 만드세요(scanf 함수 호출 전에 문자열을 출력하면 안 됩니다).

scanf에서 공백을 포함한 문자열을 입력받으려면 서식 지정자로 "%[\n]s"를 사용하면 됩니다.

정답에는 C 언어 컴파일러에서 정상적으로 컴파일되는 전체 코드를 입력해야 합니다.

(예)

입력 : nurs es run

결과 :1

이런 문제인데요 힌트는 "회문을 판별할 때 공백은 검사하지 않고 다음 글자를 검색해야 합니다. 만약 공백이 문자열의 왼쪽에 있을 때는 인덱스를 증가시켜주고, 문자열의 오른쪽에 있을 때는 인덱스를 감소시켜주면 됩니다. 이때 공백이 여러 개 연속될 수 있다고 했으므로 인덱스를 증가, 감소시킬 때는 반복문을 사용해야 합니다. 회문을 판별하는 방법은 '47.1 회문 판별'을 참조하세요."

라고 합니다.

그런데 왜 공백이 문자열의 왼쪽에 있을 때는 인덱스를 증가시키고 문자열의 오른쪽에 있을 때에는 인덱스를 감소시켜줘야 하는지 잘 모르겠습니다..

  • (•́ ✖ •̀)
    알 수 없는 사용자

2 답변

  • 반복문을 사용하여 문제를 해결하라고 되어 있으므로, while문 혹은 for문을 사용하시면 되는데요.

    nurs es run 라는 문자열의 경우 시작 인덱스 i = 0이라고하고, 마지막 인덱스 j = 10 이라고 합시다.(인덱스가 무엇인지, 왜 시작이 0이고 끝이 10인지는 이미 아시리라 믿습니다.)

    이 때, i는 문자열의 맨 왼쪽에서 시작하고, j는 문자열의 맨 오른쪽에서 시작하는데요. i는 오른쪽으로 이동하고, j는 왼쪽으로 이동하면서 i와 j가 가리키는 문자가 같은지 확인하는 겁니다.

    공백인 경우에는 비교를 하지 않는다고 되어있는데요. 만약 i가 가리키는 것이 공백인 경우 i는 오른쪽으로 한칸 이동해야합니다 (인덱스 1 증가). 반대로 j가 가리키는 것이 공백인 경우 j는 왼쪽으로 한칸 이동해야합니다 (인덱스 1 감소).

    문제 해결하시다가 모르는게 생기면 다시 물어봐주세요

    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 친절한 답변 감사합니다. 그렇다면 중첩 루프를 써서 인덱스의 위치를 바꿔가며 공백인지 아닌지 검사하고, isPalindrome 변수 조건식도 지정해 줘야 할 텐데 도무지 안쪽 루프를 어떻게 짜야 할지 감이 안 옵니다.ㅜㅜ 도와주세요 알 수 없는 사용자 2018.4.6 20:00
  • 수도코드 형식으로 나타내 드리면

    int isPalindrome(char s[])
    {
        int result = 1;
        int i = 0, j = strlen(s) - 1;
    
        while(i < j)
        {
            if s[i] == ' ' :
                i++;
                continue;
    
            if s[j] == ' ' :
                j--;
                continue;
    
            if s[i] != s[j] :
                result = 0;
                break;
    
            i++;
            j--;
        }
    
        return result;
    }
    

    중첩 루프까지는 필요없습니다

    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)