문제
"OOXXOXXOOO"와 같은 OX퀴즈의 결과가 있다. O는 문제를 맞은 것이고, X는 문제를 틀린 것이다. 문제를 맞은 경우 그 문제의 점수는 그 문제까지 연속된 O의 개수가 된다. 예를 들어, 10번 문제의 점수는 3이 된다.
"OOXXOXXOOO"의 점수는 1+2+0+0+1+0+0+1+2+3 = 10점이다.
OX퀴즈의 결과가 주어졌을 때, 점수를 구하는 프로그램을 작성하시오.
풀이
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
int max; // 최대 갯수
cin >> max; cin.ignore();
int* scoreList = new int[max]; // 점수저장 배열
for (int i = 0; i < max; i++)
{
int temp = 1; // 부여할 점수의 임시 값
int score = 0; // 누적 점수
char* quiz = new char[80]; // 퀴즈답 배열
cin >> quiz;
for (int j = 0; j < strlen(quiz); j++)
{
if (quiz[j] == 'O') // O 면 임시값을 저장 후 1 증가 (다음도 O 라는 가정하에)
{
score += temp;
temp++;
}
else if(quiz[j] == 'X') // 만약 X가 나오면 증가되었던 임시값이 다시 1로 초기화
{
temp = 1;
}
}
scoreList[i] = score; // 점수 리스트에 저장
delete[] quiz;
}
for (int i = 0; i < max; i++)
{
cout << scoreList[i] << "\n"; // 점수 리스트 출력
}
delete[] scoreList;
}
1. 필요한 저장공간을 선언하고 할당한다.
2. quiz에 최대길이가 80미만의 문자열을 입력받는다
3. for문을 통해 입력받은 '문자열의 길이'까지만 O, X를 검사한다.
for (int j = 0; j < strlen(quiz); j++)
strlen 은 <string.h> 를 통해 사용할 수 있다. 어차피 O, X가 아니면 쓰레기 값의 유무와 상관없이 if문을 거치지 않을 거라고 생각해서 j < 80 의 범위로 지정을 해주었었는데, 프로그램은 잘 돌아가지만 백준 사이트에서는 계속 틀렸다고 채점이 되어서 strlen을 써보니 맞았다.
아직도 왜 안되는지는 잘 모르겠다. << 아시는 분이 있으면 댓글 좀..
4. 기본적으로 다음에 O 가 나올 것을 가정하고 코드에서는 매번 더해줄 임시점수인 temp를 1씩 증가 시킨다.
5. 그 후, 정말로 O가 또 나오면 누적된 temp를 점수(score)에 더해주고 또 1을 미리 증가시킨다.
6. 하지만 X 가 나올 경우 누적되었던 temp 를 "다음에는 다시 O가 나올 것"이라는 생각으로 1로 초기화 시켜준다.
7. 이 과정을 반복해서 나온 총 score값을 점수리스트에 저장한다.
8. 점수리스트 max 개 요소를 출력한다.
'백준 알고리즘 단계별 풀이 (문제 수) > 1차원 배열 (7)' 카테고리의 다른 글
[C++] 평균은 넘겠지 : 4344번 (0) | 2022.06.20 |
---|---|
[C++] 특정 공식으로 새로운 평균 구하기 : 1546번 (0) | 2022.06.18 |
[C++] 나머지 배열에서 서로 다른 값 찾기 : 3052번 (0) | 2022.06.18 |
[C++] 각 자릿수의 숫자 갯수 세기 : 2577번 (0) | 2022.06.18 |
[C++] 배열에서 최댓값 찾고 인덱스 구하기 : 2562번 (0) | 2022.06.18 |