문제
"OOXXOXXOOO"와 같은 OX퀴즈의 결과가 있다. O는 문제를 맞은 것이고, X는 문제를 틀린 것이다. 문제를 맞은 경우 그 문제의 점수는 그 문제까지 연속된 O의 개수가 된다. 예를 들어, 10번 문제의 점수는 3이 된다.
"OOXXOXXOOO"의 점수는 1+2+0+0+1+0+0+1+2+3 = 10점이다.
OX퀴즈의 결과가 주어졌을 때, 점수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 테스트 케이스의 개수가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 길이가 0보다 크고 80보다 작은 문자열이 주어진다. 문자열은 O와 X만으로 이루어져 있다.
출력
각 테스트 케이스마다 점수를 출력한다.
이 문제를 처음 봤을 때 풀이법이 전혀 생각이 나지않았다. 말 그대로 막막했었다.
첫 시도는 %c와 for 문을 이용하여 O와 X들을 배열에 저장하려고 했다. 하지만 문제에서 제공하는 것은 오직 테스트 케이스의 개수뿐이라 %s를 사용해야 했다. %s를 이용하여 OX를 배열에 저장한 뒤 X를 기준으로 생각해보았다. 연속된 O의 개수가 필요하므로 X가 나오기 전까지의 O의 개수를 저장하여 카운트했다. 이를 while 문으로 구현하려 했지만 while 문을 종료시킬 조건을 생각해 내지 못했다.
배열 s의 크기는 문제에서 주어진 문자열의 길이를 고려하여 80으로 설정했다.
O가 연속해서 나올수록 O_num의 값이 증가한다.
배열의 원소가 X 일 때 앞의 O 개수로 증가된 O_num의 값으로 점수를 올리고 O_num을 0으로 초기화시킨다.마지막 값이 X가 아닐 경우를 대비하여(for 문이 종료되었는데 O_num의 값이 남아있을 때) for 문밖에서 점수를 계산한다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int case_num;
int i, j, k, p;
int O_num, sum;
char s[80];
scanf("%d", &case_num);
for (i = 0; i < case_num; i++)
{
O_num = 0;
sum = 0;
scanf("%s", &s);
for (j = 0; j < strlen(s); j++)
{
if (s[j] == 'O')
O_num++;
if (s[j] == 'X')
{
for (k = 0; k < O_num; k++)
sum += k + 1;
O_num = 0;
}
}
for (k = 0; k < O_num; k++)
sum += k + 1;
printf("%d\n", sum);
}
return 0;
}
'Algorithm > C' 카테고리의 다른 글
[백준] 1546번 : 평균 C/C++ 문제풀이 솔루션 (0) | 2021.10.29 |
---|---|
[백준] 1152번 : 단어의 개수 C/C++ 문제풀이 솔루션 (0) | 2021.10.29 |
[백준] 2675번 : 문자열 반복 C/C++ 문제풀이 솔루션 (0) | 2021.10.28 |
[백준] 10818번 : 최소,최대 C/C++ 문제풀이 솔루션 (0) | 2021.10.28 |
[백준] 11720번 : 숫자의 합 C/C++ 문제풀이 솔루션 (0) | 2021.10.28 |
댓글