c언어 문자열 질문

조회수 678회
#include <stdio.h>
#include <string.h>

int main(void)
{
    char arr[101];
    int i, j, n;
    char ch;
    int num, cnt=0, flag=0;
    scanf("%d", &num);
    for(i=0; i<num; i++)
    {
        scanf("%s", arr);
        if(strlen(arr) == 1)
        {
            cnt++;
            continue;
        }
        for(j=0; j<strlen(arr); j++)
        {
            ch = arr[j];
            for(n=j+1; n<strlen(arr); n++)
            {
                if(ch != arr[n])
                {
                    if(ch == arr[n+1])
                    {
                        flag++;
                        break;
                    }
                }
            }
        }
        if(flag == 0)
            cnt++;
    }
    printf("%d", cnt);

    return 0;
}

위 코드는 문자열을 받아서 그 문자열이 그룹 단어를 세는 코드입니다.

(ccazzzzbb는 c, a, z, b가 모두 연속해서 나타나고, kin도 k, i, n이 연속해서 나타나기 때문에 그룹 단어이지만, aabbbccb는 b가 떨어져서 나타나기 때문에 그룹 단어가 아닙니다.)

동작 방식은 문자열을 받아서 문자열 배열 요소 하나하나 다 비교를 하는 겁니다. 그룹 단어가 있다면 flag는 1이 증가하여 cnt가 증가하지 못합니다. 그래서 그룹 단어가 아니니 세지 않는 거죠. 근데.. 알맞게 나오기는 하는데 백준 채점은 틀렸습니다라고 나옵니다.. 제가 봤을 땐 잘 나오는데 말이죠 ㅠ

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

1 답변

  • for(j = 0; j < strlen(arr); j++) {
        ch = arr[j]
        for(n = j+1; n < strlen(arr); n++){
            if(ch != arr[n] && ch == arr[n+1]){
                flag++;
                break;
            }
        }
    }
    

    작성하신 코드의 일부만 가져와서 약간 수정했습니다.

    코드를 보면 문자열의 첫 문자를 저장하고 그 뒤의 문자들을 확인하되, 저장한 문자와 다른 문자가 나타나면 그 다음 문자를 확인하고, 그 문자가 저장해둔 문자와 같으면 flag에 1을 더하고 있습니다.

    만약 입력값으로 aba가 들어온다면 그룹 단어가 아니라는 걸 확인할 수 있겠네요

    그런데 입력값으로 abc가 들어오면 어떨까요?

    strlen(arr) = 3이니, j = 0, n = 2인 경우를 생각해 보겠습니다.

    ch != arr[n]'a' != 'c'이니 참이지만, ch == arr[n+1]은 어떨까요?

    다시 말해, strlen(arr) = 3일 때 arr[3]을 호출하면 어떻게 될까요?

    또, 만약 입력값으로 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbccccccccccccccccccccccccccccc

    가 들어오면 어떨까요?

    문자열 전부를 탐색해서 첫 번째 문자인 a가 불연속적인 위치에 나오지 않은 것을 확인했습니다.

    그런데 두 번째 문자도 a네요?

    또 다시 문자열 전부를 탐색해서 a가 불연속적인 위치에 나오지는 않았는지 확인합니다.

    분명 아까 한 작업 같은데 그래도 합니다.

    세 번째 문자에 대해서도 확인해야 하는데.. 또 a네요?

    그래도 또 해야죠. a 외의 다른 문자가 나올 때까지는, 반복적인 작업이지만 계속 합니다.

    어떻게어떻게 a는 다 지나왔습니다.

    이제 b를 확인해야 합니다.

    첫 번째 b를 이용해서 그 뒤에 불연속적인 b가 나오지 않는 것을 확인했습니다.

    그런데 그 뒤에 또 b, 그 뒤에도 b, b, b, b.....

    b를 다 했더니 이번엔 또 c....

    전부 탐색하기도 전에 시간이 끝날 것 같네요

    일단 배열의 크기를 가지고 for문을 사용하여 배열의 index값을 줄 때에는, 그렇게 얻은 값에 추가적인 연산을 하지 않는 것이 좋습니다.

    미처 생각하지 못한 경우에 배열의 범위를 벗어날 수 있어요

    그리고 문자열을 탐색하는 문제에서는 이 문자열을 몇 번 탐색하면 문제를 풀 수 있을까?를 생각해보고 그 횟수 안에서 문제를 풀도록 노력해보세요 ㅎㅎ

    • #include #include int main(void) { char arr[101]; int i, j, n; char ch; int num, cnt=0, flag=0; scanf("%d", &num); for(i=0; i 알 수 없는 사용자 2020.4.11 10:58

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

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

(ಠ_ಠ)
(ಠ‿ಠ)