[백준/C++] 15829번 Hashing

2021. 2. 2. 23:49알고리즘/구현

728x90
반응형

문제: www.acmicpc.net/problem/15829

 

15829번: Hashing

APC에 온 것을 환영한다. 만약 여러분이 학교에서 자료구조를 수강했다면 해시 함수에 대해 배웠을 것이다. 해시 함수란 임의의 길이의 입력을 받아서 고정된 길이의 출력을 내보내는 함수로 정

www.acmicpc.net

 

 

문제풀이

 

해시가 무엇인지 배워보는 맛보기 문제이다.

 

문제의 설명대로 따라서 구현하게 되면 50점을 받게 된다.

 

100점이 요구하는 50 길이의 문자열은 31^50 으로 크기가 어마어마하게 커지게 된다.

그래서 이 문제를 풀려면 모듈러 연산의 성질을 알아야 한다.

 

모듈러 연산은 덧셈, 뺄셈, 곱셉일 때 분배 법칙이 성립한다. (나눗셈일 땐 안됨)

 

(A+B) % MOD = (A%MOD +B%MOD) % MOD

 

때문에 코드의 모든 항에 모듈러 연산을 해주면 자료형의 크기를 초과하지 않고 정답을 구할 수 있다.

 

 

 

코드

#include <iostream>

using namespace std;

#define M 1234567891 //

int main(){
    ios::sync_with_stdio(false); cin.tie(NULL);

    int L;
    cin>>L; //문자열을 string형으로 입력받아서 쓸데가 없다.

    string str;
    cin>>str;

    long long R = 1; //계수
    long long sum = 0;
    for(int i=0; i<str.size(); i++){
        sum += int(str[i]-96)*R%M; //모듈러 연산은 덧셈, 뺄셈, 곱셈일 때 분배법칙 성립
        R *= 31;
        R %= M;
    }
    cout<<sum%M;

    return 0;
}

 

 

결과

 

728x90
반응형

'알고리즘 > 구현' 카테고리의 다른 글

[백준/C++] 2108번 통계학  (0) 2021.02.04
[백준/C++] 2164번 카드2  (0) 2021.02.03
[백준/C++] 10989번 수 정렬하기 3  (0) 2021.02.03
[백준/C++] 1929번 소수 구하기  (0) 2021.02.03
[백준/C++] 1966번 프린터큐  (1) 2021.01.29