티스토리 뷰

OX퀴즈

문제

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

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

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

입력

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

출력

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

예제 입력

5
OOXXOXXOOO
OOXXOOXXOO
OXOXOXOXOXOXOX
OOOOOOOOOO
OOOOXOOOOXOOOOX

예제 출력

10
9
7
55
30

해설

이번 문제는 생각 외로 애를 먹었다. 헛손질이 많았던 이유는 역시 문제를 정확히 읽지 않았다는 점이다. OOXXOXXOOO1 2 0 0 1 0 0 1 2 3으로 계산된다는 것을 연속될 때의 최댓값, 즉 3이 그 최종 결괏값이라고 오해하고 코딩을 했다. 예시 출력과 다른 것을 확인하고 디시 문제를 읽었지만 이번에도 대강 … 연속한 경우의 마지막 값, 즉 2, 1, 3의 합이라고 코딩을 했다. 역시나 예시 출력과는 다는 결과에 짜증이 솟구쳤다. 애초에 문제를 잘못 이해하고 있었음을 확인하고 다시 예시 출력과 동일한 결과를 내도록 코드를 수정했다. 분명 정확하게 목적한 출력값을 냈는데 채점 결과는 런타임 에러다. 와 이 간단한 문제에 시간을 들이고 있는 데 슬슬 열이 오르기 시작했다.
코드를 이리저리 고쳐보다가 혹시 예시출력이 한꺼번에 되도록 한 게 문제일까 하는 데 생각이 미쳤다. 즉 입력이 모두 끝난 다음에 출력이 되도록 코딩을 했다. 그러기 위해서는 결괏값을 저장하기 위한 배일을 사용해야 했고 이 부분이 문제가 된 게 아닐까? 매 입력마다 출력값이 생성되도록 코드를 바꾼 다음에어 채점 결과가 맞았습니다!!로 바뀌었다. 정말 짜증나는 있이다. 아! 각 라인 입력마다 출력이 이루어지도록 코드하라고 명시해 달라고.

문제는의 포인트는 아래와 같다.

  1. O가 연속 입력될 때 각 O의 점수가 1점씩 증가해야 한다.
  2. X가 입력되면 O의 점수는 처음부터(0) 다시 시작해야 한다.

이 둘을 if문을 통해 구현했다. count 변수가 O의 점수가 되며, 각각의 점수는 sum 변수에 누적된다.

            if ( str[j] == 'O')
            {
                count++;
                sum += count;
            } else {
                count = 0;
            }

소스코드: C

#include <stdio.h>
int main()
{
    char str[80];
    int i, j;
    int times, sum, count;

    scanf("%d", &times);

    for(i = 0 ; i < times; i++)
    {
        j = 0;
        sum = 0;
        count = 0;

        scanf("%s", str);
        while(str[j] != '\0')
        {
            if ( str[j] == 'O')
            {
                count++;
                sum += count;
            } else {
                count = 0;
            }
            j++;
        }
        printf("%d\n", sum);
    }

    return 0;
}

이 코드는 배열의 끝을 처리하기 위해 \0을 이용하였다. 배열은 그 마지막에 NULL 문자인 \0가 추가된다. 따라서 입력값이 80개 미만(최대 79개)의 문자열을 처리하기 위해서는 char형 배열 최소 80개 선언해야 한다. \0 문자가 들어간 메모리 공간이 하나 추가되기 때문이다. 따라서 각 라인입력이 끝나면 그 마지막에 \0이 들어 있으므로 이것을 기준으로 배열의 원소를 읽어 들이면 된다. 이 처리를 while(str[j] != '\0')이 수행하고 있다. 물론 헤더에 #include <string.h>를 추가하여 strlen()을 이용하는 방법도 있다. 본격적으로 문자열을 다룰 게 아니라면 굳이 헤더를 늘릴 필요가 있을까 싶다. 한편으로 요즘 같은 컴퓨팅 환경에서 헤더 하나 느는 걸 고민하는 것 차제가 무의미하다는 생각도…. 너무 각박한 시절에 코딩을 배웠던 잔재일지 모르겠다.


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함
05-19 00:14