백준 1157번

CharliePark·2020년 9월 25일
0

TIL

목록 보기
47/67

BOJ 1157 : 단어 공부

전체적으로 기능이 동작되는 듯 했으나..

몇가지 문제로 계속 틀린 결과나 시간 초과를 반복한 문제이다.

문제들 (str의 크기를 너무 크게 잡아 스택을 초과하는 문제는 VS에서만 발생하므로 제외시켰다)

  1. for 문안에 strlen으로 조건 비교를 할 때의 문제

strlen으로 조건을 비교하게 되면 문자열의 크기만큼 전체 수행 시간에 곱해질 수 밖에 없다. 따라서 이 경우에는 수행시간 * 1000001 ;;;; 시간 초과가 안나는 게 이상하다

  1. alpha 배열을 char 로 선언했던 문제
    1000001 크기의 문자열에서 문자가 몇 번 등장했는지 세는 문제이므로, 운 나쁘면 1000001번 까지 카운트 될 수 있음을 염두에 둬야한다. char 가 아닌 int로 선언해야 맞다.

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

int main()
{
	char str[1000001] = "";
	int alpha[26] = { 0, };

	char most_used;
	char overlap_val = 0;

	while (scanf("%s", str) != 1) continue;

	int len = strlen(str);

	for (int k = 0; k < len; k++)
	{
		if (str[k] > 'Z')
			str[k] -= ('a' - 'A');

		for (char i = 0; i < 26; i++)
		{
			if (str[k] == i + 'A')
			{
				alpha[i]++;
			}
		}
	}


	most_used = 0;

	for (int i = 1; i < 26; i++)
	{
		if (alpha[i] > alpha[most_used])
		{
			overlap_val = 0;
			most_used = i;
		}
		else if (alpha[i] == alpha[most_used])
		{
			overlap_val = 1;
		}
	}

	if (overlap_val == 1)
		printf("?");
	else
		printf("%c", most_used + 'A');
}

0개의 댓글