백준 1157번 : 단어 공부

문제 출처

https://www.acmicpc.net/problem/1157

 

1157번: 단어 공부

알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.

www.acmicpc.net

 

아스키코드를 이용해서 소문자랑 대문자를 나누고 check로 알파벳의 개수를 세주었다.

check중 가장 큰 수를 찾고

가장 여러번 나온 알파벳이 여러개인지 검사를 했다.

 

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{
	char word[1000001];
	char ans = 'A';
	int check[26] = { 0 };
	int i, max, count = 0;
	
	scanf("%s", word);

	for (i = 0; i < strlen(word); i++) {
		if (word[i] > 91)
			check[word[i] - 97]++;
		else
			check[word[i] - 65]++;
	}

	max = check[0];
	for (i = 1; i < 26; i++) {
		if (check[i] > max) {
			max = check[i];
			ans = i + 65;
		}
	}

	for (i = 0; i < 26; i++) {
		if (check[i] == max) {
			count++;
			break;
		}
	}
	
	if (count == 1) {
		printf("%c\n", ans);
	}
	else
		printf("?\n");
}

시간초과가 났다. 반복문이 3개나 있는데 당연한 결과일듯...

밑에 두 for문은 그렇다 쳐도 첫번째 for문의 경우 strlen만큼 돌면 만약 단어의 길이가 최대 길이로 나온다면 백만번이나 돌게된다.

여기에서 시간 단축할 방법을 찾아야 할거 같았는데 결국 방법이 생각나지 않아 질문게시판을 봤다.

해결법은 너무나도 예상외...

strlen(word)이 바로 시간을 많이 잡아 먹는다는 것.

for문에 strlen을 바로 사용하게 되면 조건문을 확인 할때마다 매번 word의 길이를 다시 연산하게 되는거다.

 

길이를 저장할 변수를 하나 만들고 거기에 strlen(word)를 담아두고 변수를 for문에 사용하니 맞았다.

너무나도 허무하지만 변수를 적절하게 사용하는 법을 배운문제...

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{
	char word[1000001];
	char ans = 'A';
	int check[26] = { 0 };
	int i, max, count = 1;
	int len;
	
	scanf("%s", word);
	len = strlen(word);

	for (i = 0; i < len; i++) {
		if (word[i] > 91)
			check[word[i] - 97]++;
		else
			check[word[i] - 65]++;
	}

	max = check[0];
	for (i = 1; i < 26; i++) {
		if (check[i] == max) {
			count++;
		}
		if (check[i] > max) {
			max = check[i];
			ans = i + 65;
			count = 1;
		}
	}

	if (count == 1) {
		printf("%c\n", ans);
	}
	else
		printf("?\n");
}

 

myoskin