문제 : 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
이 문제같은 경우는 1차원 배열을 이용해야 하는 문제이다.
단순히 "OX"같은 문자열 뿐만 아니라 점수의 계산값(합계)또한 배열로 처리해야 간단히 풀렸다.
문제를 보면 "OOO"처럼 연속으로 O가 나오면 점수는 1+2+3처럼 연속으로 O가 나온 개수만큼 점수도 증가한다.
따라서 점수의 합계를 처리할 배열 int *SumArray = (int*)malloc(sizeof(int)*TestCase) //동적메모리로 처리함
그리고 점수 int score 변수와 연속으로 맞출 때 증가하는 점수를 처리할 int Sum 변수도 필요하다.
코드를 보도록 하자
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | #include <stdio.h> #include <stdlib.h> #pragma warning(disable : 4996) int main() { int Test = 0, i, j; scanf("%d", &Test); int score = 0, sum = 0; int *SumArray = (int*)malloc(sizeof(int)*Test); for (i = 0; i < Test; i++) { char c[80]; scanf("%s", c); for (j = 0; j < 80; j++) { //배열이 끝나면 반복문 해제 if (c[j] == '\0' || c[j] == '\n') break; if (c[j] == 'O') { score++; sum = sum + score; } else if (c[j] == 'X') { score = 0; } } // 점수 합계를 합계처리배열에 넣음 SumArray[i] = sum; // 점수, 합계 초기화하고 다음 ox퀴즈 결과 받을준비 score = 0; sum = 0; } for (i = 0; i < Test; i++) { printf("%d\n", SumArray[i]); } free(SumArray); return 0; } | cs |
중요한 것은 역시 연속으로 O가 나올 때 점수 처리인데
for (j = 0; j<80; j++) 반복문 내용을 생각하는 데 꽤 애를 썼다.
(코딩에서 제일 어려운 점은 역시 조건식 짜는것과 메모리값 처리인 것 같다ㅜㅜ 너무어렵;;)
'알고리즘 문제 풀어보기' 카테고리의 다른 글
5x5 배열에 직각삼각형 만들기 (0) | 2019.01.30 |
---|---|
최대공약수, 최소공배수 구하기 알고리즘(+약수 구하기) (0) | 2019.01.26 |
[백준 1475] 방 번호 문제 (0) | 2019.01.24 |
[백준 1152번] 단어의 개수 구하기 (문자열 문제) (0) | 2019.01.22 |
[백준 1914번] 하노이 탑 문제 (0) | 2019.01.19 |