PS/Baekjoon Online Judge

[백준 1157] 단어공부 [C]

kimyoungrok 2021. 7. 9. 22:59

백준 - 1157


풀이

입력받은 문자열을 모두 대문자 or 소문자로 바꾸고 아스키코드 값을 이용해서 구하는 방법과,

입력받은 문자열을 수정하지 않고, 아스키코드 값만을 이용하여 구하는 방법이 있다.

먼저 후자의 방법의 경우

idx = (str[i] - 'A') % 32;
alphabet[idx]++;

처럼 만약 소문자 'b'(98)를 입력받으면 ( 'b'(98) - 'A'(65) ) % 32 = 1 이므로 alphabet[1]++; 이 된다.

하지만, 제출결과는 틀린것으로 나온다.

위 코드의 문제점이라면, str[i] - 'A' 값이 26~31 사이의 값이 나오는 경우이다.

이러한 값이 나오기 위해서는 알파벳 대/소문자가 아닌 다른 값이 입력되는 경우로, 제시된 입력 형식과 맞지않는다.

아니 이런 문제 오류는 언제고쳐?

사실 alphabet[(str[i] - 'A') % 32]++; 처럼 한 줄로 줄일려고 한 점도 없지않아 있지만, 가독성도 떨어질 뿐더러,

위에서 언급했듯이 입력 형식이 달라진다면 문제가 될 수 있다.

 

따라서 아래와 같이 소문자인 경우에 대문자로 변환하고 개수를 세는 방식을 선택했다.


소스코드

#include <stdio.h>
#define MAX 1000001
#define ALP 26
char str[MAX];
int main(){
    int alphabet[26] ={0,}, max, idx = 0;
    scanf("%s", str);
    for (int i = 0; str[i] != '\0'; i++){
        if(str[i] < 97)
            str[i] += 32;
        alphabet[str[i]-97]++;
    }
    max = alphabet[0];
    for (int i = 1; i < ALP; i++)
        if (alphabet[i] > max) {
            max = alphabet[i];
            idx = i;
        }else if (alphabet[i] == max && alphabet[i] != 0)
            idx = -1;
    putchar(idx == -1 ? '?' : idx + 'A');
}

 


출처

 

1157번: 단어 공부

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

www.acmicpc.net

 

'PS > Baekjoon Online Judge' 카테고리의 다른 글

[백준 1546] 평균 [C]  (0) 2021.07.09
[백준 1330] 두 수 비교하기 [C]  (0) 2021.07.09
[백준 1152] 단어의 개수 [C]  (0) 2021.07.09
[백준 1008] A/B [C]  (0) 2021.07.09
[백준 1001] A-B [C]  (0) 2021.07.09