새벽을 밝히는 붉은 달

[C] 백준 1371번: 입력에 대해 공부한 문제 본문

Online Judge

[C] 백준 1371번: 입력에 대해 공부한 문제

자윰 2020. 9. 2. 01:22

📎 백준 1371번 풀러 가기

 

1371번: 가장 많은 글자

첫째 줄부터 글의 문장이 주어진다. 글은 최대 5000글자로 구성되어 있고, 공백, 알파벳 소문자, 엔터로만 이루어져 있다. 그리고 적어도 하나의 알파벳이 있다.

www.acmicpc.net

문제

영어에서는 어떤 글자가 다른 글자보다 많이 쓰인다. 예를 들어, 긴 글에서 약 12.31% 글자는 e이다.

어떤 글이 주어졌을 때, 가장 많이 나온 글자를 출력하는 프로그램을 작성하시오.

입력

첫째 줄부터 글의 문장이 주어진다. 글은 최대 5000글자로 구성되어 있고, 공백, 알파벳 소문자, 엔터로만 이루어져 있다. 그리고 적어도 하나의 알파벳이 있다.

출력

첫째 줄에 가장 많이 나온 문자를 출력한다. 여러 개일 경우에는 알파벳 순으로 앞서는 것부터 모두 공백 없이 출력한다.


입력된 알파벳에서 가장 많은 알파벳을 찾는 건 여러 문제에서 다루므로 쉬웠다.

애를 먹은 건 입력 부분!

 

처음에 getchar()로 짰다가, 종료가 안 되어서 실패😅

입력을 어떻게 받아야 하지 하고 생각하다가, 발견한 함수. gets()!

 

gets() 함수는 개행 문자(\n)를 단위로 끊어주는 함수이다.

gets()는 입력을 받을 때, 개행 문자가 들어오면 이를 널 문자(\0)로 바꾼 후 배열에 저장한다.

EOF(End of File)이 들어오면, 입력받는 것을 종료한다.

 

참고로, gets() 함수는 쓰지 말 것을 권유하는 함수이다.

gets() 함수의 입력 버퍼가 넘치는 것을 노려 프로그램을 공격하는 사례가 과거에 너무 많았기 때문이다.

그렇지만 아직 배우는 입장이니 쓰는 걸로!

 

백준에 코드를 제출하기 전, 내가 테스트해볼 때 EOF를 어떻게 입력하는지도 헤맸다.

구글링 검색 결과, Ctrl+Z 를 입력하면 된다는데, 나는 실행 중인 프로그램이 종료되는 것이었다.

왜 그런가 싶었는데, 찾아보니 내가 WSL을 쓰기 때문이었다.

리눅스에서는 EOF를 입력하고 싶을 때, Ctrl+D를 입력하면 된다.


아래는 내가 작성한 코드👇

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

int main(void)
{
    char input[5001];
    int alpha[26] = { 0 };
    int cnt = 0;

    while (gets(input)) {
        for (int i = 0; input[i]; i++) {
            if (input[i] >= 'a' && input[i] <= 'z') {
                alpha[input[i] - 'a']++;
                if (alpha[input[i] - 'a'] > cnt) cnt = alpha[input[i] - 'a'];
            }
        }
    }
    
    for(int i = 0; i < 26; i++) {
        if (alpha[i] == cnt)
            printf("%c", i + 'a');
    }
    return 0;
}

✍새로 안 사실들

1. gets()는 개행 문자(\n)를 단위로 끊어주는 함수.

    gets()는 입력을 받을 때, 개행 문자가 들어오면 이를 널 문자(\0)로 바꾼 후 배열에 저장함.

    EOF(End of File)이 들어오면, 입력받는 것을 종료.

 

2. 리눅스에서 EOF를 입력하고 싶을 때는, Ctrl+D를 입력

Comments