c언어 질문 있습니다

조회수 495회

https://www.acmicpc.net/problem/8958 백준 8958번 푸는 중인데

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

int main()
{
    int n;          //케이스 개수
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
    {
        char arr[80];
        getchar();   //버퍼 비우기
        gets(arr);     //케이스 입력
        int score = 0;
        int s = 0;
        for (int k = 0; k < 80; k++)   //점수 계산
        { 
            if (arr[k] == 'O')
            {
                s++;
                score += s;
            }
            else if (arr[k] == 'X')
            {
                s = 0;
            }
        }
        printf("%d\n", score);
    }
}

일단 이렇게 코드를 짰습니다. 근데 이게 첫번째 케이스는 정상적으로 계산하는데 두번째 케이스 부터 O하나를 인식 못하고 계산해서 점수가 더 적게 나옵니다. 뭐가 문제인지 모르겠어요 ㅠㅠ

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

1 답변

  • #include<stdio.h>
    
    int main()
    {
        int n;          //케이스 개수
        scanf("%d", &n);
        for (int i = 0; i < n; ++i) {
            char arr1[80];
            int arr2[80] = { 0, };
            scanf("%s", arr1);
            if (arr1[0] == 'O') arr2[0] = 1;
    
            for (int j = 1; arr1[j] != '\0'; ++j)
                if (arr1[j] == 'O') arr2[j] = arr2[j - 1] + 1;
    
            int score = 0;
            for (int j = 0; arr1[j] != '\0'; ++j)
                score += arr2[j];
    
            printf("%d\n", score);
        }
    
        return 0;
    }
    

    올려준 코드랑 비슷하게 짜봤습니다.

    코드 보시면 이해 되실거에요.

    • 결과

    이미지

    이전 코드의 수정판은 아래와 같습니다.

    #include<stdio.h>
    #include<stdlib.h>
    
    int main()
    {
        int n;          //케이스 개수
        scanf("%d", &n);
        getchar();   //버퍼 비우기
        for (int i = 0; i < n; i++)
        {
            char arr[80]={0,};
            gets(arr);     //케이스 입력
            int score = 0;
            int s = 0;
            for (int k = 0; k < 80; k++)   //점수 계산
            { 
                if (arr[k] == 'O')
                {
                    s++;
                    score += s;
                }
                else if (arr[k] == 'X')
                {
                    s = 0;
                }
            }
            printf("%d\n", score);
        }
    }
    

    -수정판의 결과

    이미지

    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 올려주신 코드는 이해가 가는데 제 코드에서 어느 부분이 틀린 건지 알려주실 수 있을까요? 알 수 없는 사용자 2021.9.16 23:19
    • 여러 군데가 틀렸는데요. getchar(); 함수를 for루프 위로 빼야하고요. arr배열을 초기화해주지 않아서 쓰레기값으로 이전 값이 있을수 있고요. k의 for루프를 80까지 돌릴경우 이전 쓰레기 값중 O를 더할수 있으니 80이 아닌 널문자 전까지만 더해야합니다. getchar와 arr 초기화한 코드를 위 코드 밑에 추가해서 보여줄게요. 알 수 없는 사용자 2021.9.16 23:34
    • 아 감사합니다! ㅠㅠ 드디어 궁금한 부부인 해결됐네요 알 수 없는 사용자 2021.9.17 00:20

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

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

(ಠ_ಠ)
(ಠ‿ಠ)