[백준 1157] 단어공부 [C]
2021. 7. 9. 22:59ㆍPS 풀이/Baekjoon Online Judge
728x90

풀이
입력받은 문자열을 모두 대문자 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
728x90
'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 |