반응형
방학에 돌입하고 알고리즘 공부도 할 겸 백준을 하나씩 풀어보고 있다. 다시 시작한 지 얼마 안돼서 단계별로 풀어보기부터 하고있는데, 정답률이 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; }
반응형
'BOJ' 카테고리의 다른 글
[C] 백준 2941번 크로아티아 알파벳 (0) | 2018.07.05 |
---|---|
[C++] 백준 1929번 소수 구하기 (에라토스테네스의 채) (0) | 2018.07.04 |
[C] 백준 1152번 단어의 개수 (6) | 2018.07.02 |