[C언어] 백준 1157 : 아스키 코드를 이용한 문자형 정수 변환

728x90

https://www.acmicpc.net/problem/1157

 

1157번: 단어 공부

알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.

www.acmicpc.net

입력한 단어에서 가장 많이 사용된 알파벳의 대문자를 출력하는 문제.

예를들어 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를 더해 대문자값을 출력할 수 있도록 한다.

728x90