치춘짱베리굿나이스

[백준] 1157 단어 공부 본문

C C++/알고리즘풀이

[백준] 1157 단어 공부

치춘 2021. 9. 2. 14:22

단어 공부

문제

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

입력

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

출력

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

풀이

#include <stdio.h>
#include <unistd.h>

int    print_max(int count[26], int max, int max_index)
{
    int    index;
    int    max_flag;

    index = 0;
    max_flag = 0;
    while (index < 26)
        if (max == count[index++])
            max_flag++;
    if (max_flag != 1)
        printf("?");
    else
        printf("%c\n", max_index + 'A');
    return (0);
}

int    get_max(int count[26])
{
    int    max;
    int    max_index;
    int    index;

    index = 0;
    max = -1;
    max_index = 0;
    while (index < 26)
    {
        if (max < count[index])
        {
            max = count[index];
            max_index = index;
        }
        index++;
    }
    return (print_max(count, max, max_index));
}

int    main(void)
{
    char    str[1000001];
    int        index;
    int        count[26];

    read(0, str, 1000001);
    index = 0;
    while (index < 26)
        count[index++] = 0;
    index = 0;
    while (str[index])
    {
        if (str[index] - 'a' >= 0)
            count[(str[index]) - 'a'] += 1;
        else
            count[(str[index]) - 'A'] += 1;
        index++;
    }
    return (get_max(count));
}

반성회

배운건 바로 써먹어야지! 하면서 scanf 대신 read로 한번 받아봤다

너무 비효율적으로 짠것같다.. 알파벳별로 횟수를 다 저장한다음에 한번 더 검사하는 방식을 썼는데...

다른방법이 있나...? 모르겟음 처음엔 맥스값 이미 존재하는 상태에서 또 맥스값 만나면 바로 ? 출력했는데 그렇게 해놓으니까 아직 맥스값이 결정되지도 않은 상태에서 ?이 출력되는바람에.. 두번검사함 😞

그리고 vscode 쓰는데 놂 플러그인 때문에 놂걸리면 바로 씨뻘겋게 죽죽 떠서 놂맞추느라 이렇게 짠것도있고 ㅋㅋㅋㅋㅋ 생각보다 코드가 더러워보이네...

'C C++ > 알고리즘풀이' 카테고리의 다른 글

[백준] 1546 평균  (0) 2021.09.02
[백준] 1330 두 수 비교하기  (0) 2021.09.02
[백준] 1152 단어의 개수  (0) 2021.09.02
[백준] 1008 A / B  (0) 2021.09.01
[백준] 10998 A * B  (0) 2021.09.01
Comments