이번에는 백준 1157번 단어공부 문제에 대해서 같이 풀어보도록 하겠습니다. 이 문제는 알파벳을 변환할 수 있는 실력과 반복문을 돌려서 최고 값을 구할 수 있는지 물어보는 문제입니다.
문제
알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.
입력
첫째 줄에 알파벳 대소문자로 이루어진 단어가 주어진다. 주어지는 단어의 길이는 1,000,000을 넘지 않는다.
출력
첫째 줄에 이 단어에서 가장 많이 사용된 알파벳을 대문자로 출력한다. 단, 가장 많이 사용된 알파벳이 여러 개 존재하는 경우에는 ?를 출력한다.
생각 및 풀이과정
- 단어 길이가 1백만을 안 넘으니 char 배열의 길이은 1,000,001로 잡아야겠다.
- 대소문자로 이루어진 단어가 주어지고 출력은 대문자로 해야 되니 입력받은 소문자를 대문자로 바꾸는 함수를 작성하거나 이용해야겠다.
- 가장 많이 사용된 알파벳을 구해야 되니 알파벳 개수(27개)만큼 int형 배열을 만들어서 문자열에 알파벳이 나올 때마다 카운트를 해야겠다.
- 카운트를 다하고 난 뒤에 많이 나온 알파벳을 찾을 수 있게 반복문을 돌려서 max 값을 찾아야겠다.
코드
#ifndef _CRT_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS
#endif /* _CRT_SECURE_NO_WARNINGS */
#include <stdio.h>
#include <string.h>
int main()
{
char string[1000001];
int alphabat[26] = { 0 };
int samechk = 0;
int max = 0;
int i;
scanf("%s", string);
int len = strlen(string);
for (i = 0; i < len; ++i) { //strlen()함수를 for문에 넣으면 계속 호출돼서 시간복잡도가 N^2됨주의!!
if (string[i] >= 'a' && string[i] <= 'z') {
string[i] -= 'a' - 'A'; /* 배열에 소문자가 있으면 대문자로 변경 */
}
alphabat[string[i]-'A']++; /* 알파벳 배열에 1추가 */
}
for (int i = 0; i < 27; i++) { /* 많은 알파벳 찾는 반복문 */
if (maxnum < alphabat[i]) {
maxnum = alphabat[i];
max = i;
samechk = 0;
}
else if (maxnum == alphabat[i]) {
samechk = 1;
}
}
if (samechk == 1) {
printf("?");
}
else {
printf("%c", max+'A');
}
return 0;
}
<ctype.h> 안에 toupper라는 대문자로 바꾸어 주는 함수가 있기는 있습니다. 하지만 굳이 <ctype.h> 헤더를 넣어서 toupper함수를 쓰기에는 효율적인 코드가 아닌 것 같아서 그냥 제가 작성을 하였습니다.
소문자를 대문자로 바꾸는 방법은 소문자를 찾은 뒤에 소문자와 대문자의 차이를 빼주면 소문자가 대문자로 바뀝니다.
대문자는 아스키코드(ASCII)에서 65~90까지 이고 소문자는 아스키코드(ASCII) 97~122이기에 차이인 32만큼 빼주면 대문자로 바뀝니다. (알파벳 아스키코드 A = 65, a = 97 차이는 32이라는 것을 외워두면 좋습니다.)
samechk 변수를 넣은 이유는 maxnum개수가 두 개 이상이 되면 '?'를 출력해줘야 하기에 samechk를 만들어서 samechk가 1이 된다면 maxnum 되는 알파벳이 2개 이상이므로 '?'출력 samechk가 0이 된다면 maxnum 되는 알파벳 출력하도록 만들었습니다.
'C언어 > BOJ' 카테고리의 다른 글
[C언어] 백준 2562번 최댓값 (0) | 2023.03.05 |
---|---|
[C언어] 백준 1546번 평균 (0) | 2023.02.25 |
[C언어] 백준 1152번 단어의 개수 (0) | 2023.02.20 |
[C언어] 백준 1000 번 A+B (0) | 2023.02.20 |
댓글