본문 바로가기
BOJ

[C] 백준 1157번 단어 공부

by 야호호코코 2018. 7. 3.
반응형

 방학에 돌입하고 알고리즘 공부도 할 겸 백준을 하나씩 풀어보고 있다. 다시 시작한 지 얼마 안돼서 단계별로 풀어보기부터 하고있는데, 정답률이 30%대 이하인 문제를 풀면 코드를 포스팅해서 기록해야겠다. 나름의 만족감을 느끼기 위해!



 단어 공부 문제는 알파벳 대소문자로 된 단어를 입력하면 가장 많이나온 알파벳이 무엇인지 출력하는 문제이다. 단, 가장 많이나온 알파벳이 여러개면 '?'를 출력한다.


 대소문자 구분 없이 알파벳을 세기 때문에 단어를 입력 받은 뒤 바로 전부 대문자로 바꿔주는 작업을 했다. 변수는 가장 많은 알파벳의 개수, 가장 많이 나온 알파벳의 빈도 수(몇 번 나왔는지), 가장 많이 나온 알파벳 이렇게 세 가지로 사용했다.


 이중 for문으로 순회할 때 j의 크기가 기준인 i보다 작을 때 str[i]와 같은 문자가 나오면 이미 세는 작업을 완료한 문자이므로 무시한다. 그 이외에 상황에서는 같은 문자가 나오면 count를 증가시킨다. 


 문자를 세는 작업을 완료하면 가장 많이 나온 빈도수와 같은 지 체크, 만약 같다면 가장 많은 알파벳의 개수를 증가시켜준다. 아니면 빈도수와 비교하여 가갱신을 해준다. 이 때 가장 많은 알파벳의 개수도 1개로 초기화 시킨다. 끝까지 순회가 완료되면, 가장 많은 알파벳의 개수를 확인해 1을 초과하면 ?를, 아니면 가장 많이 나온 알파벳을 출력한다.


  

 

 

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

int main() {

	char str[1000001];

	int i, j;

	int count;

	int max_char_count;
	int max_count;
	char max_char;

	scanf("%s", str);

	for (i = 0; str[i]; i++) {
		if ('a' <= str[i] && str[i] <= 'z') {
			str[i] -= 32;
		}
	}

	max_count = -1;

	for (i = 0; str[i]; i++) {

		count = 0;

		for (j = 0; str[j]; j++) {

			if (j < i) {
				if (str[i] == str[j])
					break;
			}
			else if (str[i] == str[j])
				count++;
			
		}

		if (max_count == count) {
			max_char_count++;
		}

		if (max_count < count) {
			max_count = count;
			max_char = str[i];
			max_char_count = 1;
		}

	}

	if (max_char_count > 1) {
		max_char = '?';
	}

	printf("%c", max_char);
	
	
	return 0;

}


반응형