![[백준 1157번] 단어공부 (c)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwI4qA%2FbtrpP3xFfi9%2FPEBspu2UDzn30dor0bxkt1%2Fimg.png)
[백준 1157번] 단어공부 (c)알고리즘2022. 1. 4. 19:16
Table of Contents
문제
https://www.acmicpc.net/problem/1157
1157번: 단어 공부
알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.
www.acmicpc.net
코드
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h> //isalpha(), isupper()이 정의된 헤더파일
#include <limits.h> //자료형의 최댓값과 최솟값이 정의된 헤더 파일
int main(void)
{
char str[1000001];
int cnt[26] = { 0 };
int index, max_index, max_cnt = 0;
int max = INT_MIN; //작은 값으로 max를 초기화켜서, 첫번째 비교할 때 max가 비교한 수로 바뀜
scanf("%s", str);
for (int i = 0; str[i] != '\0'; i++) { //문자열의 끝에는 \0이 있음
if (islower(str[i])) { //소문자일 때
index = str[i] - 97; // a의 아스키코드 값이 97
}
else if (isupper(str[i])) { //대문자일 때
index = str[i] - 65; // A의 아스키코드 값이 65
}
else {
fprintf(stderr, "알파벳을 입력하세요");
exit(EXIT_FAILURE);
}
cnt[index]++;
}
for (int i = 0; i < 26; i++) {
if (max < cnt[i]) max = cnt[i];
}
for (int i = 0; i < 26; i++) {
if (max == cnt[i]) {
max_index = i;
max_cnt++;
}
}
if (max_cnt == 1) {
printf("%c", max_index + 65);
}
else {
printf("?");
}
return 0;
}
부가설명
cnt[26]은 26개의 알파벳이 각각 몇 번씩 반복되었는지를 저장합니다.
max는 가장 많이 반복된 알파벳의 반복횟수를 나타냅니다.
max_index는 가장 많이 반복된 알파벳의 cnt[] 인덱스를 (a라면 0, b라면 1...) 나타냅니다.
max_cnt는 max_index의 개수를 나타냅니다. 이때 max_index가 두개 이상이면 ?을 출력합니다.
입력된 한 글자 한 글자를 돌면서, 대문자이면(isupper) -65, 소문자이면(islower) -97을 더해줍니다.
만약 Apple이 입력되었다면,
str[0]은 A이므로 index는 str[0] - 65, 즉 0이 되므로 cnt[0]이 1이 됩니다.
p의 경우 index는 str[1] - 97, 즉 20이 되므로 cnt[20]이 1이 됩니다.
이후 p가 또 나오므로 cnt[20]은 2가 됩니다.
l, e도 위와 같이 계산하면 최종 출력값은 P가 됩니다.
'알고리즘' 카테고리의 다른 글
[백준 2775번] 부녀회장이 될테야 (c) (0) | 2022.01.06 |
---|---|
[백준 1152번] 단어의 개수 (c) (0) | 2022.01.05 |
[백준 10809번] 알파벳 찾기 (c) (0) | 2022.01.03 |
[백준 1110번] 더하기 사이클 (C) (0) | 2022.01.02 |
[백준 4344번] 평균은 넘겠지 (C, 이중포인터 이용) (0) | 2022.01.02 |
@blog_bbg :: bbg
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!