#문제
1157번: 단어 공부
https://www.acmicpc.net/problem/1157
1157번: 단어 공부
알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.
www.acmicpc.net
#접근방법
단어에서 가장 많이 사용된 알파벳을 구하려면 최대값을 찾는 조건문이 필요하고,
가장 많이 사용된 알파벳이 여러 개 존재하는 경우를 고려해야 하므로 최대값과 같은 값이 나오면 예외처리를 해주는 조건문이 필요하다.
이 때, 대문자와 소문자를 구별하지 않는 것을 고려해야 한다.
#풀이
#include <stdio.h>
#include <string.h>
char a[1000005];
int arr[26];
int main(){
int max = 0;
int size;
char ans;
scanf("%s",a);
size = strlen(a);
for(int i=0;i<size;i++)
if(a[i]>='a') arr[a[i]-'a']++;
else arr[a[i]-'A']++;
for(int i=0;i<26;i++)
if(arr[i]==max){
ans = '?';
}
else if(arr[i]>max){
max = arr[i];
ans = 'A'+i;
}
printf("%c",ans);
return 0;
}
알파벳은 a부터 z까지 총 26개가 존재하므로 이 성질을 이용하여 26칸을 가진 배열을 만들어 주어서 편리하게 계산하였다.
내가 푼 풀이를 이해하려면 아스키코드를 알아야된다.
아스키 코드란? 미국정보교환표준부호(영어: American Standard Code for Information Interchange), 또는 줄여서 ASCII( /ˈæski/, 아스키)는 영문 알파벳을 사용하는 대표적인 문자 인코딩이다. - 출처 (위키백과)
a부터 z는 97 ~ 122, A부터 Z는 65 ~ 90이다.
영문자가 소문자이면 arr[a[i]-'a']++, 대문자이면 arr[a[i]-'A']++ 이렇게 적어서
arr[0]은 'a' arr[1]은 'b' ... arr[25]은 'z'의 개수로 처리해주었다.
이러면 arr배열은 단어에서 사용된 알파벳 a부터 z까지의 개수가 들어있다.
이제 조건문을 적절하게 사용해서 최대값을 구하면 된다.
arr[i] > max이면 max = arr[i]로 최대값을 갱신해주면서 ans = 'A' + i로 값을 넣어준다.
arr[i] == max이면 가장 많이 사용된 알파벳이 같다는 뜻이므로 ans = '?'를 넣어준다.
따라서 ans를 출력하면 정답이다.
#성능
#정리
아스키코드는 영문 알파벳을 사용하는 대표적인 문자 인코딩이다.
a는 97값을 할당받고 있고, A는 65값을 할당받고 있다.
알파벳이 총 26개라는 것을 생각해서 배열 26개로 각각의 알파벳이 나온 개수를 구하고,
최대값을 구하는 과정에서 같은 값일 때 예외처리를 해주면 풀 수 있다.
'하루 한 문제' 카테고리의 다른 글
[백준] 1546번 : 평균 [C/C++] (0) | 2021.11.19 |
---|---|
[백준] 1330번 : 두 수 비교하기 [C/C++] (0) | 2021.11.18 |
[백준] 1152번 : 단어의 개수 [C/C++] (0) | 2021.11.16 |
[백준] 1008번 : A/B [C/C++] (0) | 2021.11.15 |
[백준] 1001번 : A-B [C/C++] (0) | 2021.11.14 |