https://www.acmicpc.net/problem/8958
1. 문제
💡 문제
"OOXXOXXOOO"와 같은 OX퀴즈의 결과가 있다. O는 문제를 맞은 것이고, X는 문제를 틀린 것이다. 문제를 맞은 경우 그 문제의 점수는 그 문제까지 연속된 O의 개수가 된다. 예를 들어, 10번 문제의 점수는 3이 된다.
"OOXXOXXOOO"의 점수는 1+2+0+0+1+0+0+1+2+3 = 10점이다.
OX퀴즈의 결과가 주어졌을 때, 점수를 구하는 프로그램을 작성하시오.
💡 입력
첫째 줄에 테스트 케이스의 개수가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 길이가 0보다 크고 80보다 작은 문자열이 주어진다. 문자열은 O와 X만으로 이루어져 있다.
💡 출력
각 테스트 케이스마다 점수를 출력한다.
2. 풀이
#include<stdio.h>
int main(){
// 입력 받은 값 (테스트 케이스 개수) 를 담아둘 input.
// 퀴즈의 점수는 연속된 O의 개수라고 하니 누적된 값을 계산하기 위한 score.
// 각각의 퀴즈 점수를 합산해서 담아둘 sum.
int input = 0, score = 0, sum = 0;
// 입력 조건에서 각 테스트 케이스는 한 줄로 이루어져 있고, 길이가 0보다 크고 80보다 작은 문자열이라고 했다.
char result[80] = {0,};
// scanf를 통해 테스트 케이스 개수 값을 받아 input에 넣어준다.
scanf("%d", &input);
// 테스트 케이스 개수만큼 문자열을 입력 받을 것이다.
for (int i = 0 ; i < input ; i++){
scanf("%s", result);
// 입력 받은 퀴즈 결과가 O라면 score에 1을 더해 점수가 누적되도록 한다.
// 반대로 결과가 X라면 누적된 score 값을 0으로 되돌린다,
for(int j = 0 ; j < 80 ; j++){
if(result[j] == 'O'){
score++;
sum += score;
}
else if(result[j] == 'X'){
score = 0;
}
else {
break;
}
}
// 하나의 테스트 케이스가 종료될 때마다, 현재 sum 값을 출력하도록 한다.
printf("%d\n", sum);
// 테스트 케이스가 종료되었다면 sum과 score을 0으로 초기화시켜준다.
sum = 0;
score = 0;
}
}
3. 메모
for(int j = 0 ; j < 80 ; j++){
if(result[j] == 'O'){
score++;
sum += score;
}
else if(result[j] == 'X'){
score = 0;
}
// else {
// break;
// }
}
처음에 else 구문을 쓰지 않고 제출했더니 바로 틀렸다는 메시지를 받았다. 친구의 도움을 받아 곰곰히 생각해보니 result를 초기화하지 않고 계속 사용한 것이 문제였다.
세 번째 테스트 케이스 'OOOOOOOOOO'는 result[0]부터 result[10]까지 잘 들어갔지만 두 번째 테스트 케이스 결과값이 result[11]부터 result[15]에 남아있어 값이 다르게 나왔다. 고로 else { break; } 를 통해 'O'나 'X'가 아닐 경우 (한 마디로 '\0'를 체크하면) for문을 빠져나오도록 한다.
'프로그래밍 > 백준 알고리즘' 카테고리의 다른 글
[C] 단어공부 (백준 알고리즘 1157번) (0) | 2021.07.23 |
---|---|
[C] 문자열 반복 (백준 알고리즘 2675번) (0) | 2021.07.23 |
[C] 알파벳 찾기 (백준 알고리즘 10809번) (0) | 2021.07.23 |
[C] 숫자의 합 (백준 알고리즘 11720번) (0) | 2021.07.21 |
[C++] 문제 1 - 아이디 추천 (2021 카카오 신입공채 1차 온라인 코딩 테스트) (0) | 2021.07.20 |