모름

https://www.acmicpc.net/problem/8958

 

8958번: OX퀴즈

문제 "OOXXOXXOOO"와 같은 OX퀴즈의 결과가 있다. O는 문제를 맞은 것이고, X는 문제를 틀린 것이다. 문제를 맞은 경우 그 문제의 점수는 그 문제까지 연속된 O의 개수가 된다. 예를 들어, 10번 문제의 점수는 3이 된다. "OOXXOXXOOO"의 점수는 1+2+0+0+1+0+0+1+2+3 = 10점이다. OX퀴즈의 결과가 주어졌을 때, 점수를 구하는 프로그램을 작성하시오. 입력 첫째 줄에 테스트 케이스의 개수가 주어진다. 각 테스트 케이스는

www.acmicpc.net

문제

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

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

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

입력

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

출력

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

 

코드

using System;

class Program {

    static void Main()
    {
        //첫째 줄에 테스트 케이스의 수를 입력받아야한다.
        int n = int.Parse(Console.ReadLine());

        //둘째 줄에 n줄의 테스트 케이스를 입력받아야한다.
        string[] testCase = new string[n];
        for (int i = 0; i < n; i++)
        {
            testCase[i] = Console.ReadLine();
        }

        // OX문자열을 점수로 새야한다.
        // - 연속된 문자열일 경우 점수가 가속되야한다.
        // - 앞의 문자열과 이전의 문자열이 같다면 (만약 O라면)
        // - 주어지는 점수가 올라가야한다. 결과값은 축적된다.
        // - 앞의 문자열과 이전의 문자열이 다르다면 (만약 X라면)
        // - 주어지는 점수는 항상 0점으로 초기화된다.
        // - 결과값에 축적되지 않는다.
        for (int i = 0; i < n; i++)
        {
            char[] temp = testCase[i].ToCharArray();
            int j = 0;
            int resultScore = 0;
            int score = 0;

            while (true)
            {
                if(temp[j].ToString() == "O")
                {
                    score++;
                    resultScore += score;
                }
                else
                {
                    score = 0;
                }

                j++;

                if (j == temp.Length) break;
            }

            //결과창에 검사한 테스트 케이스의 결과값을 출력한다.
            Console.WriteLine(resultScore);
        }
    }
}

먼저 테스트 케이스의 수를 입력받고, 둘째 줄부터 테스트 케이스를 실제로 입력받습니다. n번만큼 케이스를 받으면 됩니다. 입력받은 문자열은 string[]에 차근차근 쌓아줍니다. 그리고 출력을 위해 테스트케이스를 일일히 계산해야합니다. 코딩을 시작하기 전에 글 코딩(주석)을 해봤습니다. 글 코딩을 한 후 적힌 문장대로 코딩을 하기만 하면 정상출력이 됩니다.

 

코드를 줄이는 것은 이렇게 차례대로 푼 후에, 중복되거나 불필요한 부분이 있으면 정리해주면됩니다. 아래는 겹치는 부분과 굳이 나눠쓸 필요없는 부분을 줄여 써봤습니다.

using System;

class Program {

    static void Main()
    {
        int n = int.Parse(Console.ReadLine());
        string[] testCase = new string[n];

        for (int i = 0; i < n; i++)
        {
            testCase[i] = Console.ReadLine();
            char[] temp = testCase[i].ToCharArray();
            int j = 0;
            int resultScore = 0;
            int score = 0;

            while (true)
            {
                if(temp[j].ToString() == "O")
                {
                    score++;
                    resultScore += score;
                }
                else
                {
                    score = 0;
                }

                j++;

                if (j == temp.Length) break;
            }

            Console.WriteLine(resultScore);
        }
    }
}

for문을 두 번 쓸 필요가없어서 정리했습니다.

 

예제와 콘솔출력비교

정상적으로 출력됨을 확인했습니다.