본문 바로가기
백준(C언어)/22년 7월

7월 17일(일) - 4단계(8958번)

by C0MPAS 2022. 7. 17.

4단계 - 8958번

 

8958번: OX퀴즈

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

www.acmicpc.net

 

문제점

1. count 변수를 최초에 0으로 초기화하지 말아야 한다.

-> count 변수를 최초에 int i로 시작하는 반복문의 안쪽에서, 그리고 int j로 시작하는 반복문의 바깥에서

    1로 초기화해야 'O'의 개수를 1부터 시작해서 셀 수 있다.

2. int j로 시작하는 반복문 안에서 o_count의 배열에 숫자를 넣으며 'O'의 개수를 셀 때, o_count[j] = o_count[j] + 1 로 코드를 작성하면 잘못 카운팅을 하게된다.

-> o_count[j] = o_count[j] + count 로 설정을 해야 2번째 'O'는 +2, 3번째'O'는 +3을 o_count의 배열에 더할 수 있다.

3. else if 'X'를 굳이 따로 설정할 이유가 없다.

-> if (test_case[j] == 'O')를 체크했다면, 나머지는 모두 else로 처리해도 괜찮다.

어차피 입력값이 O 아니면 X이기 때문에, O만 최초에 if에서 체크하면 모두 해결가능하다.

 

 

오답 풀이

#include <stdio.h>
#include <string.h>

int main(void)
{
	int n;
	char test_case[80];
	int O_count[100] = {0, };
	int count = 0;
	scanf("%d", &n);

	for (int i = 0; i < n; i++)
	{
		scanf("%s", &test_case[i]);
		for (int j = 0; j < strlen(test_case); j++)
		{
			count = 1;
			if (test_case[j] == 'O')
			{
				O_count[i] = O_count[i] + 1;
				count++;
			}
			else if (test_case[j] == 'X')
			{
				count = 1;
			}

		}
	}

	for (int i = 0; i < n; i++)
	{
		printf("%d\n", O_count[i]);
	}
	

	return 0;
}

 

최종 정답풀이

#include <stdio.h>
#include <string.h>

int main(void)
{
	int n;
	int count;
	char test_case[80];
	int o_count[100] = { 0, };

	scanf("%d", &n);
	for (int i = 0; i < n; i++)
	{
		scanf("%s", &test_case[i]);
		count = 1;

		for (int j = 0; j < strlen(test_case); j++)
		{
			if (test_case[j] == 'O')
			{
				o_count[i] += count;
				count++;
			}
			else
			{
				count = 1;
			}
		}
	}
	for (int i = 0; i < n; i++)
	{
		printf("%d\n", o_count[i]);
	}
	return 0;
}

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

댓글