김펭귄 관찰일기
article thumbnail

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

 

8958번: OX퀴즈

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

www.acmicpc.net

 

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문을 빠져나오도록 한다.

profile

김펭귄 관찰일기

@Penguin.Kim