촉촉한초코칩
[백준] 1157(단어 공부) c언어 본문
문제
알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.
입력
첫째 줄에 알파벳 대소문자로 이루어진 단어가 주어진다. 주어지는 단어의 길이는 1,000,000을 넘지 않는다.
출력
첫째 줄에 이 단어에서 가장 많이 사용된 알파벳을 대문자로 출력한다. 단, 가장 많이 사용된 알파벳이 여러 개 존재하는 경우에는 ?를 출력한다.
- 문자열을 입력받는다.
- size 변수에 문자열 길이를 구한다.
- alpha 문자 배열 변수에 알파벳을 대문자로 저장한다.
- cnt int형 배열 변수를 26 크기로 선언하고 0으로 초기화한다.
- 먼저 소문자를 대문자로 바꿔준다.
- 빈도수를 세기 위해 이중 for문을 실행한다.
문자열 길이 만큼 for문을 돌리고, 문자와 알파벳이 같다면 cnt의 해당하는 알파벳 위치에 1을 증가시킨다. - 최대값을 출력하기 위해 26번 for문을 돌린다.
최대값을 구하면 max에 최대값을 넣고, tmp에는 해당 알파벳을 넣는다.
만약 max 값과 동일한 최대값이 발견되면 tmp에는 ?을 넣는다. - for문 빠져나오고 tmp를 출력하면 끝
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void) {
char *str;
str = calloc(1000000, sizeof(char));
scanf("%s", str);
int size = strlen(str);
char alpha[26] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int cnt[26];
for(int i=0; i<26; i++) {
cnt[i] = 0;
}
//소문자->대문자
for(int i=0; i<size; i++) {
if(str[i]>='a' && str[i]<='z')
str[i]-=32;
}
//빈도수 세기
for(int i=0; i<size; i++) {
for(int j=0; j<26; j++) {
if(str[i] == alpha[j]) {
cnt[j]++;
}
}
}
//최대값 출력
int max = 0;
char tmp;
for(int i=0; i<26; i++) {
if(cnt[i] > max) {
max = cnt[i];
tmp = alpha[i];
}
else if(cnt[i] == max) {
tmp = '?';
}
}
printf("%c\n", tmp);
free(str);
}
> 동적 배열 생성은 사실 필요없는 부분...
https://iwantlunch.tistory.com/261
- 소문자<-> 대문자 변환 코드 참고
- 파이썬으로 코드를 짠다면 함수로 쉽게 바꿀 수 있을 듯...
'Algorithm' 카테고리의 다른 글
[백준] 11659(구간 합 구하기 4) c언어 (슬라이딩 윈도우 알고리즘) (0) | 2023.11.02 |
---|---|
[백준] 2720(세탁소 사장 동혁) c언어 (0) | 2023.10.28 |
[백준] 10809(알파벳 찾기) c언어 (0) | 2023.10.22 |
[백준] 25206(너의 평점은) c언어 (0) | 2023.09.13 |
[백준] 11650(좌표 정렬하기) c언어 (0) | 2023.07.16 |