https://www.acmicpc.net/problem/8958
문제
"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문을 두 번 쓸 필요가없어서 정리했습니다.
예제와 콘솔출력비교
정상적으로 출력됨을 확인했습니다.