풀이
입력받은 문자열을 모두 대문자 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');
}
출처
'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 |