Bakjoon Q8958 - C++

Q8958


Problem

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

“OOXXOXXOOO”의 점수는 1+2+0+0+1+0+0+1+2+3 = 10점이다.

OX퀴즈의 결과가 주어졌을 때, 점수를 구하는 프로그램을 작성하시오.

Input

첫째 줄에 테스트 케이스의 개수가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 길이가 0보다 크고 80보다 작은 문자열이 주어진다. 문자열은 O와 X만으로 이루어져 있다.

Output

각 테스트 케이스마다 점수를 출력한다.

예제 입력

1
2
3
4
5
6
5
OOXXOXXOOO
OOXXOOXXOO
OXOXOXOXOXOXOX
OOOOOOOOOO
OOOOXOOOOXOOOOX

예제 출력

1
2
3
4
5
10
9
7
55
30

나의 제출

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
using namespace std;

int scoring(char* a);
int main(){
    int n;
    scanf("%d", &n);
    while(n--){
        char arr[80]={};
        while(cin >> arr)
        printf("%d\n",scoring(arr));
    }
}
int scoring(char *a){
    int sum=0, x=0, y=0;
    while(a[x]!='\0'){
        y++;
        if(a[x]=='X')
            y=0;
        sum+=y;
        x++;
    }
    return sum;
}

추가 내용

issue #1

도저히 알 수가 없었던 cin.getline()의 문제점… 이건 나중에도 한 번 더 봐야할 것 같다. 출력을 하면 한번이 씹히고 대신 0이 출력되는 기묘한 문제점이 있었다. 다행히 다른 것으로 대체하면서 해결.

while(cin » arr)이라는 정말 직관으로 막 적은 코드가 깔끔하게 작동했다. 내용은 단순하다. arr에 입력을 하되, 온전한 입력이 들어가지 않은 경우(개행 등) 0을 return시켜서 loop를 나가는 목적이다. 이번엔 입력만 받고 loop 내용은 비우는 식으로 코드를 짰는데 예쁘게 잘 작동했다.

issue #2

loop 안에서 모두 해결할 수는 있었지만 그럴바에 차라리 함수를 새로 파서 깔끔하고 보기 좋은 직관적인 코드를 만드는 것이 더 좋을 것 같아서 scoring 함수를 새로 짰다.

총평

이걸로 1차원 배열 I/O 졸업이다. int형 입력에 대한 것과 str입력에 대한 것 모두 마치면서 이제 다시 배열에 대한 감을 잡아가는 것 같다!

남은 건 N차원 배열뿐,,,