알파벳 대소문자로 된 단어가 주어지면 , 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 만들어보는 문제이다.
#include <stdio.h>
#include <string.h>
먼저 가장 기본적으로 쓰이는 stdio를 선언해주고 단어의 길이가 1000000을 넘지 않기때문에 단어를 배열로 받아 배열의 길이를 측정할 계획이다.
배열의 길이를 측정하려면 strlen을 사용해야 하기 떄문에 string.h 도 같이 선언해주었다.
int main(void) {
int i, j, max, result=0, len;
char arr[1000000];
int cnt[26] = {0, };
int select = 0;
int number;
다음으로 변수들을 선언해주었는데 단어의 길이가 1000000을 넘지 않기 때문에 그 크기에 맞는 배열을 선언하고 만약 가장 많이 쓰인 단어가 중복됬을 경우를 위해 result를 선언해주었다. number는 배열의 값을 저장하고 select 는 가장 많이 쓰인 단어가 뭔지 저장하기 위한 변수를 선언했다. cnt[26] 은 알파벳의 길이가 26이기 때문에 26의 배열 크기로 선언했다.
scanf("%s", arr);
len = strlen(arr);
여기서 주목할것은 strlen(arr)을 for문 안에서 돌리지 않았다는것이다.
문제의 제한시간이 2초이기때문에 for 문에서 계속 배열을 돌면 시간 초과로 탈락이다.
그래서 미리 for문 밖에서 len이라는 변수에 입력된 문자를 담아주었다.
for(i=0; i < len; i++){
// 입력된 문자의 길이만큼 실행시킨다 ( 아까 변수에 지정한 strlen(arr) )
if( arr[i] >= 'A' && arr[i] <= 'Z'){
number = arr[i] - 'A';
}
// arr[i] 가 대문자 A~Z 사이 일 경우에 아스키코드 값상 대문자 A를 빼주면 숫자 0~26 사이로 값이 나오기 때문에 그 값을 number라는 변수에 넣어주었다.
else if ( arr[i] >= 'a' && arr[i] <= 'z'){
number = arr[i] - 'a';
}
// 대문자와 같이 입력값이 소문자 a~z일 경우 소문자 a를 빼주면 숫자 0~26 사이의 값을 number 라는 변수에 담아준다 .
cnt[number]++;
// number에 저장된 정수값은 cnt[number]의 인덱스로 1만큼 더해준다.
// 이렇게 해서 어떤 알파벳이 쓰였는지 하나하나 체크해준다.
}
여기서는 입력 받은 값을 정수화 시켜서 number 라는 변수안에 담아주고
cnt[number]로 인덱스 값을 1씩 증가 시켜서 각 알파벳이 몇번씩 쓰였는지 체크해주는 코드를 작성했다.
max = cnt[0];
// max 라는 변수안에 가장 첫번째 인덱스 값을 넣어주어서 가장 많이 쓰인 알파벳을 찾는다.
for(i = 1; i < 26; i++) {
if(max < cnt[i]) {
max = cnt[i]; select = i; } }
// select 변수 안에 cnt[i] 가 아니라 i로 넣어주는거 중요
위에서 지정했던 max 라는 변수를 cnt[i] 와 비교해서 max보다 cnt[i] 가 더 클경우 max 는 cnt[i]로 초기화 시키고 select 를 cnt[i] 가 아닌 i 로 지정해줘야한다.
for(i = 0; i < 26; i++) {
if(max == cnt[i]) result++; }
// 만약 max 와 cnt[i] 값이 똑같다면 result 에 1씩 더해서 가장 많이 쓰인 알파벳이 2개이상인지 찾아본다.
if(result > 1) printf("?\n"); // 만약 2개 이상 많이 사용된 알파벳이 있다면 ? 출력
else printf("%c", select+'A'); // 아니라면 아까 지정했던 select는 정수 값으로 지정되어 있어서 대문자 A 만큼 더해서 출력해준다.
return 0;
}
문제를 풀며 느낀점.
먼저 이 문제를 꼭 혼자 힘으로 풀어보겠다고 끙끙 거리며 풀었다.
분명 작동하는데에 문제는 없었으나 이상하게 자꾸 틀렸다고 나왔다. 그 원인을 찾는데에 이틀은 쏟은거 같다 ( 직장을 다니느라 하루에 3시간 정도밖에 공부를 못했다. )
내가 했던 실수는 strlen 을 사용하지 않았고 밑에 처럼 사용했었다.
for(i=0; arr[i] != '\0';i++)
분명 작동은 잘됬으나 무슨 이유에서 인지 제출을 하면 틀렸다고 나왔었다.
그래서 고민끝에 strlen을 사용해 보기로 했으나 이번엔 시간 초과로 나왔다.
하지만 그 원인은 생각보다 별거 아닌? 문제였다.
for 문 속에서 strlen을 돌려서 for문이 하나하나 돌때마다 배열을 체크 해야했고 그 덕분에 2초라는 시간제한이 있는 문제에서 시간초과로 틀렸다고 나왔던것이다.!
그래서 나는 for 문 바깥에서 len 이라는 변수안에 strlen(arr)을 선언해주었고 마침내 해결했다..!
다음 문제를 향해 나가보자