https://www.acmicpc.net/problem/1157
입력한 단어에서 가장 많이 사용된 알파벳의 대문자를 출력하는 문제.
예를들어 Mississipi라는 단어는 ?를, zZa라는 단어는 Z를 출력하도록 한다.
아스키 코드표를 참고해서 풀 수 있었다.
표를 보면 대문자 A~Z -> 65~90이고 소문자 a~z -> 97~122까지의 값을 가지게 된다는 것을 확인할 수 있다.
소문자를 대문자로 변환하기 위해서 97~122사이의 값을 받았을 때 32를 빼면 65~90사이의 소문자 범위로 나타낼 수 있다.
#include <stdio.h>
#include <string.h>
int main(void){
char arr[1000000];
int alpah[26]={0, }, max=0, tmax=0, i=0, num=0;
int len=0;
scanf("%[^\n]",arr);
len = strlen(arr);
for(i=0; i<len; i++){
if((int)arr[i]>=97)
alpah[(int)arr[i]-32-65]++;
if((int)arr[i]<97)
alpah[(int)arr[i]-65]++;
}
for(i=0; i<26; i++){
if(max<alpah[i]){
tmax=i; //가장 높은 알파벳의 아스키코드값 구하기
max=alpah[i]; //가장 높은 알파벳의 갯수
}
}
for(i=0; i<26; i++)
if(max==alpah[i]) num++;
if(num>=2) printf("?");
else printf("%c",(char)(tmax+65));
return 0;
}
1 : 배열에다가 문자열을 입력 받는다.
2 : 반복문을 이용해 각 문자에 접근하고, 이를 정수형으로 바꾸었을 때 소문자에 해당하는 경우 32를 빼서 대문자의 십진수 값과 일치하도록 만든다. 여기서 65를 더 빼면 문자의 알파벳 값을 십진수 0~25까지의 범위(알파벳 A~Z까지의 개수와 같다.)로 지정할 수 있을 것이다.(대문자 범위에 해당하는 경우 그냥 65만 빼면된다.)
이를 활용해 배열의 주소값에 입력한 문자들을 담으면 문자열에 있는 각각의 알파벳들이 몇 개씩 사용되었는지를 구분할 수 있다.
3 : 두번째 반복문을 통해서 배열에 담긴 값들 중 가장 큰 값을 뽑아낼 수 있다. alpah[3]의 값이 max가 된다면 알파벳 D가 최초에 입력받은 문자열에서 가장 많이 사용된 알파벳이 될 것이다.
4 : 다시 반복문을 사용해서 가장 많이 사용된 알파벳이 복수로 존재한다면 ?를 출력하도록 한다.
그렇지 않다면 앞에서 구한 알파벳의 십진수 값에 65를 더해 대문자값을 출력할 수 있도록 한다.
'C언어' 카테고리의 다른 글
[C언어] 백준 2798 : 블랙잭 (0) | 2022.01.26 |
---|---|
[C언어] char 배열 선언시 주의사항 (0) | 2022.01.24 |
[C언어] 문자 입출력 함수 getchar(), putchar() (0) | 2022.01.24 |
[C언어] : scanf()함수 입력 무시 문제, 버퍼링 (0) | 2022.01.19 |
[C언어] : 변수 초기화와 쓰레기 값 발생 (0) | 2022.01.19 |