백준 1157번
https://www.acmicpc.net/problem/1157
1157번: 단어 공부
알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.
www.acmicpc.net
1. 문제
알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.
2. 내가 작성한 알고리즘
#include <stdio.h>
#pragma warning (disable:4996)
#include <string.h>
int main() {
char input[1000000];
int i,j,len,max;
int al[26]={0, };
int this = 0;
int count = 0;
scanf("%s", input);
len = strlen(input);
for (i = 'a'; i <= 'z'; i++) { //a~z 까지 반복
for (j = 0; j < len; j++) { //입력한 len 값 만큼 반복
if (i == input[j])
al[i - 'a']+=1; // 배열이 정수형이므로 i,a 둘다 아스키 코드로 반환된다.
}
}
for (i = 'A'; i <= 'z'; i++) { // A~Z 까지 반복
for (j = 0; j < len; j++) {
if (i == input[j])
al[i-'A']+=1; // 대문자든 소문자든 같은 배열에 넣기 위함
}
}
max = al[0]; // 가장 큰 값을 al[0]으로 임의로 지정
for (i = 1; i < 26; i++) {
if (max < al[i])
max = al[i]; //max 값을 찾음
this = i; // 그 max 값에 인덱스 번호를 추출
}
for (i = 0; i < 26; i++) {
if (max == al[i]) // 값이 여러개 나올때를 대비해 문자열의 수를 알기 위한 조건문
count+=1;
}
if (count > 1) {
printf("?");
}
else {
printf("%c", this + 'A'); // 정수형이므로 추출한 this(위치) + 'A'(대문자를 추출하기 위해) 로 입력한다.
}
return 0;
}
3. 이번 알고리즘을 통해 배운 점
아스키 코드를 이용하여 알고리즘을 푸는 센스가 필요한 것 같다.
모든 배열에 0이란 값을 넣어주기 위해서는 자료형 변수[크기]={0, }; 이다.
소문자(변수)-'a' 와 대문자(변수)-"A" 는 같다. 대소문자 구분없이 같은 배열에 저장하기 위해 사용한다.
출력할 때도 마찬가지로 내가 구하는 알파벳 순서를 변수로 두고 (a=0 , b=1, c=2, d=3 ....)
%c 로 변수+'a' 를하면 소문자가 변수+'A'를 하면 대문자가 출력된다.
strlen(배열)은 배열의 크기를 알려주는 함수이다. strlen(배열[인덱스번호])는 불가하다.
문자의 길이를 알 수있는 방법은 count 변수를 두고 배열을 이용하여 count 변수의 값으로 문자의 길이를 추출할 수 있다.
'C > 백준 알고리즘 (c언어)' 카테고리의 다른 글
문자열 practice 04_단어의 개수 (0) | 2021.07.09 |
---|---|
문자열 practice 01_ 알파벳 찾기 (0) | 2021.07.06 |
함수 practice 02_한수 (0) | 2021.07.01 |
함수 practice 01_셀프 넘버 (0) | 2021.07.01 |
1차원배열 practice 03_OX퀴즈 (0) | 2021.06.30 |