백준/C++

[백준] 8958번: OX퀴즈 | C++ 풀이

성실한 당근농부 2023. 6. 24. 21:16

# 문제

OX퀴즈의 결과가 주어졌을 때, 점수를 구하는 프로그램을 작성하시오.

 

 


 

# 풀이

입출력 버퍼 공부를 다시 해야겠다 느끼게 해준 문제... 왜냐? cin.ignore() 까먹었기 때문...

정답 소스코드를 바로 확인해보자!

 

#include <iostream>
using namespace std;

int main(){
    ios_base::sync_with_stdio(false);	// 두 표준 입출력 동기화 해제
    cin.tie(NULL);	// 입력과 출력 묶음을 풀기

    int n;
    cin >> n;
    cin.ignore(); // 개행 버퍼 비우기
    string str;
    
    while(n--){
        getline(cin, str);
        int scoreSum = 0;
        int score = 1;
        for(int i=0; i<str.length(); i++){
            if(str[i] == 'O') {
                scoreSum += score;
                score++;
            }else score = 1;
        }
        cout << scoreSum << '\n';
    }
    return 0;
}

우선 우리는 문제를 맞고 틀린 것에 대한 정보도 중요하지만, 문제를 맞은 경우 그 문제의 점수는 그 문제까지 연속된 O의 개수가 된다는 점도 꼭 기억하고 있어야 한다.

 

 

 

int n;
cin >> n;
cin.ignore(); // 개행 버퍼 비우기
string str;

뒤에 나올 while문에서 getline으로 입력되는 값들을 받아오기 위해서는 cin.ignore()을 통해 개행버퍼를 비워주는 과정이 꼭 필요하다.

만약 해당 코드를 넣지 않는다면, 테스트케이스의 수가 입력되고 getline이 그 다음에 따라오는 개행부터 받아오게 된다. 테스트 케이스 값이 4라면 케이스 입력이 3번만 되고, 5라면 실제 입력은 4번만 되는 문제가 발생하는 것이다. 꼭 잊지 말자.

그 후 입력 케이스를 받아올 string 변수를 생성해주면 준비 끝!

 

 

while(n--){
    getline(cin, str);
    int scoreSum = 0;
    int score = 1;
    for(int i=0; i<str.length(); i++){
        if(str[i] == 'O') {
            scoreSum += score;
            score++;
        }else score = 1;
    }
    cout << scoreSum << '\n';
}

테스트케이스만큼 while문을 돌며 getline으로 입력을 받아준다.

점수 총합을 계산해줄 scoreSum 변수와 각 문제의 점수를 계산해줄 score 변수를 각각 알맞게 초기화 후 시작, 해당 테스트 케이스의 길이만큼 for문을 돌며 판별을 하면 된다.

 

O가 입력되었을 경우에는 스코어 총합에 점수를 더해주고, 연속될 경우를 고려해 score 값을 하나 증가 시켜준다.

X가 입력되었을 경우에는 다시 score 값을 1로 변경해주면 끝!

for문을 나온 후엔 구해진 점수 총합을 출력 후 개행해주면 정답이다.

 

 

 

 

 


 

 

 

8958번: OX퀴즈

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

www.acmicpc.net

 

728x90