본문 바로가기

코딩/백준 BOJ

[백준/C언어] 8958번 - OX퀴즈

백준 웹사이트 "8958번 - OX퀴즈" 문제풀이입니다.

언어는 C언어입니다. (제출 언어: C99)

 


문제

 

8958번: OX퀴즈

"OOXXOXXOOO"와 같은 OX퀴즈의 결과가 있다. O는 문제를 맞은 것이고, X는 문제를 틀린 것이다. 문제를 맞은 경우 그 문제의 점수는 그 문제까지 연속된 O의 개수가 된다. 예를 들어, 10번 문제의 점수

www.acmicpc.net


소스 코드

#include <stdio.h>
#include <string.h> // strlen의 이용을 위해

int main(void){
    int N;
    scanf("%d\n", &N);

    for(int i=0; i<N; i++){
        char quiz[80]; // 0보다 크고 80보다 작은 문자열
        scanf("%s", quiz); // array names are pointers
        int test_len = strlen(quiz); // sizeof quiz : 80, strlen(quiz) : 문자열의 실제 길이

        int score[test_len];
        for (int j=0; j<test_len; j++){
            if(quiz[j]=='O'){ // 'O'일 경우, 앞의 것을 확인
                if(j>=1 && quiz[j-1]=='O'){
                    score[j]=score[j-1]+1;
                }
                else{
                    score[j]=1;
                }
            }
            else{ //'X'일 경우, score에 0 저장
                score[j]=0;
            }
            //printf("%d\n", score[j]);
        }

        int sum=0;
        for(int k=0; k<test_len; k++){
            sum=sum+score[k];
        }
        printf("%d\n", sum);
    }
}

문제 풀이

  문자열을 입력받는 첫 문제입니다. C언어에서 문자열(string)은 곧 char의 배열입니다. 한 글자, 한 글자가 하나의 char이므로 만약 10글자짜리 input이라면 크기가 10인 char 배열에 저장할 수 있습니다. 이 문제에서는 Line 9에서 quiz라는 이름의 크기 80인 char 배열을 선언합니다. 그 후, Line 10에서 quiz에 저장할 문자열을 입력받습니다. 이때 특이하게도 quiz에 &가 붙지 않는 것을 확인할 수 있을텐데, 이것은 배열에 입력받을 때의 특징입니다. C언어에서는 '배열의 이름은 포인터이다'라는 규칙이 있는데, 평소에 &를 변수 앞에 붙였던 것은 그 변수의 포인터를 의미하였습니다. 배열의 경우는 이름 자체가 포인터이기에, &를 붙일 필요가 없는 셈이죠. 포인터의 개념은 매우 복잡하기에 이에 관해서는 추후에 더 다루겠습니다ㅎㅎ.

  Line 10에서는 입력된 문자열의 길이를 확인하기 위해 'strlen'이라는 함수를 이용합니다. 이때 'sizeof quiz'를 이용하지 않는데, 그 이유는 Line 9에서 quiz를 크기 80의 배열로 이미 선언하였기에, sizeof를 이용하면 그 값이 80으로 뜹니다. 하지만 저희가 입력한 string이 크기 80의 배열을 모두 차지하지 않을 확률이 크죠? 예를 들어 입력 문자열이 'OOXXOXXOOO'이라면 80개의 배열 요소 중 앞의 10개만 사용하게 됩니다. 따라서 '10'이라는 문자열의 실제 길이를 구하기 위해 'strlen'의 함수를 <string.h>에서 가져와 이용합니다.

  Line 13 ~ 27은 맞춘 문제의 점수를 계산하는 과정입니다. for문을 이용해 가장 앞 문제부터 하나씩 확인을 하며, 'O'일 경우와 'X'일 경우를 나누어 점수를 계산하고 저장합니다. 예를 들어 입력값이 'OOXXOXXOOO'일 경우, score[0]=1, score[1]=2, score[2]=0, ... score[9]=3이 저장됩니다.

  마지막 Line 29 ~ 33에서는 전체 점수를 계산, 출력합니다. score이란 배열에 저장된 점수들을 각각 확인하고 'sum'이란 변수에 더함으로써 전체 합을 계산하죠.

 

반응형