https://www.acmicpc.net/problem/1157
1157번: 단어 공부
알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.
www.acmicpc.net
입력받은 알파벳 문자열에서 대소문자 상관없이 가장 많이 나온 문자를 찾는 문제.
문제를 풀기위해 아스키코드로 접근하였다. 먼저 아스키 코드값을 알아보자.
#include <stdio.h>
int main(){
printf("%d\n%d", 'A' , 'a');
}
A의 아스키코드는 65이고 a의 아스키코드는 97로 나온다. 따라서 A~Z의 아스키코드는 65~90이고, a~z의 아스키코드는 97~122임을 알 수 있다.
이를 이용하여 다음과 같이 풀이하였다.
#include <stdio.h>
int main () {
int alpha[26] = {0,}; // 입력받은 문자열에 있는 알파벳의 개수
int ascii, idx = 0, temp = -1, max = 0, loc; // 아스키코드, 반복인자, 최댓값의 개수, 많이 나온 알파벳의 위치
char input[1000001]; // 입력받을 문자열
scanf("%s", input);
while (input[idx] != '\0') { // 알파벳이 나온 횟수를 기록
ascii = input[idx]; // 알파벳의 아스키코드 저장
ascii = ascii <= 90 ? ascii - 65 : ascii - 97; // 대소문자에 따라 식을 다르게 조작
alpha[ascii]++; // 해당하는 위치의 요소를 1 더한다.
idx++;
}
for (int i = 0; i < 26; i++) {
if (temp < alpha[i]) { // 최댓값이 발견되면
temp = alpha[i]; // 바꾸고
loc = i; // 위치를 기록한 후에
max = 0; // 같은 개수의 것들을 초기화
} else if (temp == alpha[i] && alpha[i] != 0) { // 같은 개수인 경우
max++; // 1 더한다
}
}
if (max == 0) { // 출력
printf("%c", loc + 65); // 대문자로 출력하기 위해 아스키코드를 조작한다
} else {
printf("?"); // max가 0이 아니라는 건 중복되는게 있다는 뜻
}
return 0;
}
'coding_test > BAEKJOON' 카테고리의 다른 글
백준 2908번 C언어 풀이 (0) | 2021.08.12 |
---|---|
백준 1152번 C언어 풀이 (0) | 2021.08.11 |
백준 2675번 C언어 풀이 (0) | 2021.08.10 |
백준 10809번 C언어 풀이 (0) | 2021.08.07 |
백준 1065번 C언어 풀이 (0) | 2021.08.06 |