본문 바로가기
백준 알고리즘 단계별 풀이 (문제 수)/1차원 배열 (7)

[C++] OX퀴즈 : 8958번

by 17번 일개미 2022. 6. 20.
728x90

문제

 

"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 개 요소를 출력한다.

728x90