김펭귄 관찰일기
article thumbnail

https://www.acmicpc.net/problem/1157

 

1157번: 단어 공부

알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.

www.acmicpc.net

 

 

1. 문제


💡 문제

알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.

💡 입력

첫째 줄에 알파벳 대소문자로 이루어진 단어가 주어진다. 주어지는 단어의 길이는 1,000,000을 넘지 않는다.

💡 출력

첫째 줄에 이 단어에서 가장 많이 사용된 알파벳을 대문자로 출력한다. 단, 가장 많이 사용된 알파벳이 여러 개 존재하는 경우에는 ?를 출력한다.

 

 

2. 풀이


#include <stdio.h>
#include <string.h>
#include <ctype.h>

int main(){
    int i, len, maxNum = 0, printNum = 0, count = 0;
    // 1,000,000을 넘지 않는 문자열을 담기 위한 배열 word
    char word[1000001] = {0,};
    // 중복된 'a' ~ 'z'의 수를 담기 위한 배열 check
    // 인덱스 0번부터 a, b, c, ..., z라 가정하고 값을 담을 것이다
    int check[26] = {0,};
    scanf ("%s", word);

	// strlen(word)를 통해 문자열의 길이를 받아옴
    for (i = 0, len = (int)strlen(word); i < len; i++){
    	// 현재 문자를 대문자로 바꾼 뒤,
        // ('A'의 아스키 코드는 65이기에 65를 빼준다.)
        word[i] = toupper(word[i]);
        // (현재 문자 - 65)번째 인덱스 값에 1을 더해줌
        check[word[i]-65]++;
    }
    
    for (i = 0 ; i < 26 ; i++){
    	// 현재 check 값이 maxNum보다 크다면
        if (check[i] > maxNum){
            // 그 값을 maxNum에 저장
            maxNum = check[i];
            // 가장 많이 사용된 알파벳이 중복되었지만 중복된 횟수보다 더 큰 값을 찾은 경우를 대비
            count = 0;
            // 결과값 산출을 위한 printNum
            // 인덱스 넘버에 65를 더하면 대문자 알파벳 값이 나옴
            printNum = i;
        }
        else if (check[i] == maxNum){
        	// 가장 많이 사용된 알파벳이 중복되었을 경우를 체크하기 위한 count
            count++;
        }
    }
    
    // 가장 많이 사용된 알파벳이 중복되었을 경우, '?' 출력
    if (count > 0) printf("?\n");
    // 아니라면, 최대로 중복된 checkNum 인덱스 + 65를 출력
    else printf("%c\n", printNum+65);
}

 

 

3. 메모


 주의할 점이 하나 있다. 분명 틀리지 않았는데, '시간 초과'라고 자꾸 뜨는게 아닌가.. ㅠ 한참을 구글링 해본 끝에 드디어 알아냈다, 헤헤..

Whyrano..

for (int i = 0 ; i < (int) strlen(word) ; i++)
-> 이렇게 코드를 짤 경우, for문이 반복될 때마다 strlen 함수가 실행된다고 한다.

int len;
for (int i = 0, len = (int)strlen(word) ; i < len ; i++)
-> 고로 이렇게 짜도록 하자 :)

 

그리고 하나 더, 결과값을 저장하고 만든 배열은 꼭 int형으로 선언해줘야 한다...!

char check[26] = {0,}
-> 이렇게 하면 '틀렸습니다.' 메세지를 받게 되니 주의하자
profile

김펭귄 관찰일기

@Penguin.Kim