자료구조&알고리즘/백준
[C++] 백준 8958번 - OX퀴즈(getline, cin.ignore함수)
celinayk
2023. 7. 5. 17:58
반응형
문제
"OOXXOXXOOO"와 같은 OX퀴즈의 결과가 있다. O는 문제를 맞은 것이고, X는 문제를 틀린 것이다. 문제를 맞은 경우 그 문제의 점수는 그 문제까지 연속된 O의 개수가 된다. 예를 들어, 10번 문제의 점수는 3이 된다.
"OOXXOXXOOO"의 점수는 1+2+0+0+1+0+0+1+2+3 = 10점이다.
OX퀴즈의 결과가 주어졌을 때, 점수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 테스트 케이스의 개수가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 길이가 0보다 크고 80보다 작은 문자열이 주어진다. 문자열은 O와 X만으로 이루어져 있다.
출력
각 테스트 케이스마다 점수를 출력한다.
접근
1. getline이용해서 엔터기준으로 입력받고
2. 점수계산을 했다
O인경우는 경우가 두가지로 나뉘는데 앞에가 O일때와 아닐때이다 이거만 주의하면 될듯?
나는 따로 카운팅 변수를 만들었다
앞에가 X일때는 카운팅 변수를 다시 1로 초기화했다 다음 O가 올때 더하기 위해서
그리고 앞에도 O가왔을때는 카운팅숫자를 하나 늘리고 그걸 sum에 더해줬다
이렇게 하니까 쉽게 해결했음
코드
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <limits.h>
#include <algorithm>
#include <string>
#include <vector>
#include <math.h>
#include <cmath>
#include <cstring>
using namespace std;
int main() {
int n = 0;
scanf("%d", &n);
cin.ignore();
for (int i = 0; i < n; i++) {
string str;
getline(cin, str);
int sum = 0;
int cnt = 0;
for (int j = 0; j < str.length(); j++) {
if (str[j]=='O') {
if (str[0] || str[i - 1] == 'O') {
//바로 앞문자가 O일때
cnt++;
sum += cnt;
}
else { //바로 앞 문자가 x일때
sum += 1;
cnt = 1; //카운팅 초기화
}
}
else {
cnt = 0;
}
}
cout << sum << endl;
}
return 0;
}
리뷰
첨에 str[0] || 이 조건 없어서 자꾸 예외가 발생했었음
이유 : 0번째에서 -1을 계산해버리니까... 그래서 따로 조건을 추가했다
아그리고 cin.ignore()함수를 썼는데 이게 입력 버퍼의 모든 내용을 제거해주는 함수
입력버퍼에 '\n'
가 남아있으니까 예상치 못하게 에러가 날수도 있으니까
특정 개수의 문자를 읽은 후에 개행 문자를 무시하고 다음 입력 동작을 진행하고 싶을 때 사용할 수 있습니다.
라고 한다
출처
https://www.acmicpc.net/problem/8958
8958번: OX퀴즈
"OOXXOXXOOO"와 같은 OX퀴즈의 결과가 있다. O는 문제를 맞은 것이고, X는 문제를 틀린 것이다. 문제를 맞은 경우 그 문제의 점수는 그 문제까지 연속된 O의 개수가 된다. 예를 들어, 10번 문제의 점수
www.acmicpc.net