https://www.acmicpc.net/problem/1157
1. 문제
💡 문제
알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.
💡 입력
첫째 줄에 알파벳 대소문자로 이루어진 단어가 주어진다. 주어지는 단어의 길이는 1,000,000을 넘지 않는다.
💡 출력
첫째 줄에 이 단어에서 가장 많이 사용된 알파벳을 대문자로 출력한다. 단, 가장 많이 사용된 알파벳이 여러 개 존재하는 경우에는 ?를 출력한다.
2. 풀이
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main(){
int i, len, maxNum = 0, printNum = 0, count = 0;
// 1,000,000을 넘지 않는 문자열을 담기 위한 배열 word
char word[1000001] = {0,};
// 중복된 'a' ~ 'z'의 수를 담기 위한 배열 check
// 인덱스 0번부터 a, b, c, ..., z라 가정하고 값을 담을 것이다
int check[26] = {0,};
scanf ("%s", word);
// strlen(word)를 통해 문자열의 길이를 받아옴
for (i = 0, len = (int)strlen(word); i < len; i++){
// 현재 문자를 대문자로 바꾼 뒤,
// ('A'의 아스키 코드는 65이기에 65를 빼준다.)
word[i] = toupper(word[i]);
// (현재 문자 - 65)번째 인덱스 값에 1을 더해줌
check[word[i]-65]++;
}
for (i = 0 ; i < 26 ; i++){
// 현재 check 값이 maxNum보다 크다면
if (check[i] > maxNum){
// 그 값을 maxNum에 저장
maxNum = check[i];
// 가장 많이 사용된 알파벳이 중복되었지만 중복된 횟수보다 더 큰 값을 찾은 경우를 대비
count = 0;
// 결과값 산출을 위한 printNum
// 인덱스 넘버에 65를 더하면 대문자 알파벳 값이 나옴
printNum = i;
}
else if (check[i] == maxNum){
// 가장 많이 사용된 알파벳이 중복되었을 경우를 체크하기 위한 count
count++;
}
}
// 가장 많이 사용된 알파벳이 중복되었을 경우, '?' 출력
if (count > 0) printf("?\n");
// 아니라면, 최대로 중복된 checkNum 인덱스 + 65를 출력
else printf("%c\n", printNum+65);
}
3. 메모
주의할 점이 하나 있다. 분명 틀리지 않았는데, '시간 초과'라고 자꾸 뜨는게 아닌가.. ㅠ 한참을 구글링 해본 끝에 드디어 알아냈다, 헤헤..
for (int i = 0 ; i < (int) strlen(word) ; i++)
-> 이렇게 코드를 짤 경우, for문이 반복될 때마다 strlen 함수가 실행된다고 한다.
int len;
for (int i = 0, len = (int)strlen(word) ; i < len ; i++)
-> 고로 이렇게 짜도록 하자 :)
그리고 하나 더, 결과값을 저장하고 만든 배열은 꼭 int형으로 선언해줘야 한다...!
char check[26] = {0,}
-> 이렇게 하면 '틀렸습니다.' 메세지를 받게 되니 주의하자
'프로그래밍 > 백준 알고리즘' 카테고리의 다른 글
[C] 상수 (백준 알고리즘 2908번) (0) | 2021.07.24 |
---|---|
[C] 단어의 개수 (백준 알고리즘 1152번) (0) | 2021.07.24 |
[C] 문자열 반복 (백준 알고리즘 2675번) (0) | 2021.07.23 |
[C] 알파벳 찾기 (백준 알고리즘 10809번) (0) | 2021.07.23 |
[C] 숫자의 합 (백준 알고리즘 11720번) (0) | 2021.07.21 |