알고리즘 문제/[백준]

[백준] 1157번: 단어공부

latter2005 2020. 12. 5. 00:13

문제 주소 : www.acmicpc.net/problem/1157

 

1157번: 단어 공부

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

www.acmicpc.net

문제 확인

 

간단한 헤싱 문제

베열 인덱스 연산 대신 char 값을 그대로 인덱스로 사용해서 연산 횟수를 줄입니다.

 

풀이

 

fread를 통해 문자열을 한 번에 받아서 연산합니다. getchar을 통해 문자를 하나하나 입력받으면 보통 8ms~12ms가 나오게 됩니다.

문자를 입력받으면 그 문자의 아스키 값을 그대로 배열 인덱스로 사용하여 횟수를 체크합니다.

문자열 입력이 끝나면 최대 빈도수의 문자를 찾으며 같은 횟수의 문자가 나오면 dup 변수를 통해 문제 조건을 맞춥니다.

dup 변수가 1이라면 ?을 출력하고 아니라면 최대 빈도수 문자를 출력합니다.

 

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <cstdio>
 
int main() {
    char str[1000001];
    register int i, dif = 'a' - 'A';//대문자와 소문자 인덱스 차이
    int c[123= {};
    fread(str, 1sizeof(str), stdin);//한번에 입력받음
    for (char *= str; *p; p++)
        ++c[*p];
    char m = 0, dup = 0;
    for (i = 'A'; i <= 'Z'; i++) {
        c[i] += c[i + dif];//빈도수를 합침
        if (c[i] > c[m]) {//최대 빈도수 문자 초기화
            m = i;
            dup = 0;//중복 초기화
        }
        else if (c[i] == c[m])//같으면 중복 설정
            dup = 1;
    }
    if (dup)
        putchar('?');
    else
        putchar(m);
}
cs
반응형