반응형
방학에 돌입하고 알고리즘 공부도 할 겸 백준을 하나씩 풀어보고 있다. 다시 시작한 지 얼마 안돼서 단계별로 풀어보기부터 하고있는데, 정답률이 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 |