๐Ÿ˜Ž ๊ณต๋ถ€ํ•˜๋Š” ์ง•์ง•์•ŒํŒŒ์นด๋Š” ์ฒ˜์Œ์ด์ง€?

[BAEKJOON C++] 2902_KMP๋Š” ์™œ KMP์ผ๊นŒ? ๋ณธ๋ฌธ

๐Ÿฆฅ ์ฝ”ํ…Œ/BAEKJOON

[BAEKJOON C++] 2902_KMP๋Š” ์™œ KMP์ผ๊นŒ?

์ง•์ง•์•ŒํŒŒ์นด 2023. 8. 15. 00:57
728x90
๋ฐ˜์‘ํ˜•
KMP ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด KMP์ธ ์ด์œ ๋Š” ์ด๋ฅผ ๋งŒ๋“  ์‚ฌ๋žŒ์˜ ์„ฑ์ด Knuth, Morris, Prett์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. 
์ด๋ ‡๊ฒŒ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—๋Š” ๋ฐœ๊ฒฌํ•œ ์‚ฌ๋žŒ์˜ ์„ฑ์„ ๋”ฐ์„œ ์ด๋ฆ„์„ ๋ถ™์ด๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.

๋˜ ๋‹ค๋ฅธ ์˜ˆ๋กœ, ์œ ๋ช…ํ•œ ๋น„๋Œ€์นญ ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜ RSA๋Š” ์ด๋ฅผ ๋งŒ๋“  ์‚ฌ๋žŒ์˜ ์ด๋ฆ„์ด Rivest, Shamir, Adleman์ด๋‹ค.
์‚ฌ๋žŒ๋“ค์€ ์ด๋ ‡๊ฒŒ ์‚ฌ๋žŒ ์„ฑ์ด ๋“ค์–ด๊ฐ„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋‘ ๊ฐ€์ง€ ํ˜•ํƒœ๋กœ ๋ถ€๋ฅธ๋‹ค.

์ฒซ ๋ฒˆ์งธ๋Š” ์„ฑ์„ ๋ชจ๋‘ ์“ฐ๊ณ , ์ด๋ฅผ ํ•˜์ดํ”ˆ(-)์œผ๋กœ ์ด์–ด ๋ถ™์ธ ๊ฒƒ์ด๋‹ค. 
์˜ˆ๋ฅผ ๋“ค๋ฉด, Knuth-Morris-Pratt์ด๋‹ค. ์ด๊ฒƒ์„ ๊ธด ํ˜•ํƒœ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.
๋‘ ๋ฒˆ์งธ๋กœ ์งง์€ ํ˜•ํƒœ๋Š” ๋งŒ๋“  ์‚ฌ๋žŒ์˜ ์„ฑ์˜ ์ฒซ ๊ธ€์ž๋งŒ ๋”ฐ์„œ ๋ถ€๋ฅด๋Š” ๊ฒƒ์ด๋‹ค. 
์˜ˆ๋ฅผ ๋“ค๋ฉด, KMP์ด๋‹ค.

๋™ํ˜์ด๋Š” ๋งค์ผ๋งค์ผ ์ž์‹ ์ด ํ•œ ์ผ์„ ๋ชจ๋‘ ๋ฉ”๋ชจ์žฅ์— ์ ์–ด๋†“๋Š”๋‹ค. 
์ž ์„ ์ž๊ธฐ ์ „์—, ์˜ค๋Š˜ ํ•˜๋ฃจ ๋ฌด์—‡์„ ํ–ˆ๋Š”์ง€ ๋˜์ƒˆ๊ฒจ ๋ณด๋Š” ๊ฒƒ์œผ๋กœ ํ•˜๋ฃจ๋ฅผ ๋งˆ๊ฐํ•œ๋‹ค.
ํ•˜๋ฃจ๋Š” ์ด ๋ฉ”๋ชจ๋ฅผ ๋ณด๋˜ ์ค‘, ์ง€๊ธˆ๊นŒ์ง€ ๊ธด ํ˜•ํƒœ์™€ ์งง์€ ํ˜•ํƒœ๋ฅผ ์„ž์–ด์„œ ์ ์–ด ๋†“์€ ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ๋‹ค.
์ด๋ ‡๊ฒŒ ๊ธด ํ˜•ํƒœ๋กœ ํ•˜๋ฃจ ์ผ์„ ๊ธฐ๋กํ•˜๋‹ค๊ฐ€๋Š” ๋ฉ”๋ชจ์žฅ ๊ฐ€๊ฒฉ์ด ๋ถ€๋‹ด๋˜์–ด ํŒŒ์‚ฐ๋  ๊ฒƒ์ด ๋ป”ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, 
์•ž์œผ๋กœ๋Š” ์งง์€ ํ˜•ํƒœ๋กœ ๊ธฐ๋กํ•˜๋ ค๊ณ  ํ•œ๋‹ค.

๊ธด ํ˜•ํƒœ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ด๋ฆ„์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ด๋ฅผ ์งง์€ ํ˜•ํƒœ๋กœ ๋ฐ”๊พธ์–ด ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค

์ž…๋ ฅ
์ž…๋ ฅ์€ ํ•œ ์ค„๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๊ณ , 
์ตœ๋Œ€ 100๊ธ€์ž์˜ ์˜์–ด ์•ŒํŒŒ๋ฒณ ๋Œ€๋ฌธ์ž, ์†Œ๋ฌธ์ž, ๊ทธ๋ฆฌ๊ณ  ํ•˜์ดํ”ˆ ('-', ์•„์Šคํ‚ค์ฝ”๋“œ 45)๋กœ๋งŒ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. 
์ฒซ ๋ฒˆ์งธ ๊ธ€์ž๋Š” ํ•ญ์ƒ ๋Œ€๋ฌธ์ž์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ , ํ•˜์ดํ”ˆ ๋’ค์—๋Š” ๋ฐ˜๋“œ์‹œ ๋Œ€๋ฌธ์ž์ด๋‹ค. 
๊ทธ ์™ธ์˜ ๋ชจ๋“  ๋ฌธ์ž๋Š” ๋ชจ๋‘ ์†Œ๋ฌธ์ž์ด๋‹ค.

์ถœ๋ ฅ
์ฒซ ์ค„์— ์งง์€ ํ˜•ํƒœ ์ด๋ฆ„์„ ์ถœ๋ ฅํ•œ๋‹ค.
// [2902] KMP๋Š” ์™œ KMP์ผ๊นŒ?

/*
KMP ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด KMP์ธ ์ด์œ ๋Š” ์ด๋ฅผ ๋งŒ๋“  ์‚ฌ๋žŒ์˜ ์„ฑ์ด Knuth, Morris, Prett์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. 
์ด๋ ‡๊ฒŒ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—๋Š” ๋ฐœ๊ฒฌํ•œ ์‚ฌ๋žŒ์˜ ์„ฑ์„ ๋”ฐ์„œ ์ด๋ฆ„์„ ๋ถ™์ด๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.

๋˜ ๋‹ค๋ฅธ ์˜ˆ๋กœ, ์œ ๋ช…ํ•œ ๋น„๋Œ€์นญ ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜ RSA๋Š” ์ด๋ฅผ ๋งŒ๋“  ์‚ฌ๋žŒ์˜ ์ด๋ฆ„์ด Rivest, Shamir, Adleman์ด๋‹ค.
์‚ฌ๋žŒ๋“ค์€ ์ด๋ ‡๊ฒŒ ์‚ฌ๋žŒ ์„ฑ์ด ๋“ค์–ด๊ฐ„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋‘ ๊ฐ€์ง€ ํ˜•ํƒœ๋กœ ๋ถ€๋ฅธ๋‹ค.

์ฒซ ๋ฒˆ์งธ๋Š” ์„ฑ์„ ๋ชจ๋‘ ์“ฐ๊ณ , ์ด๋ฅผ ํ•˜์ดํ”ˆ(-)์œผ๋กœ ์ด์–ด ๋ถ™์ธ ๊ฒƒ์ด๋‹ค. 
์˜ˆ๋ฅผ ๋“ค๋ฉด, Knuth-Morris-Pratt์ด๋‹ค. ์ด๊ฒƒ์„ ๊ธด ํ˜•ํƒœ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.
๋‘ ๋ฒˆ์งธ๋กœ ์งง์€ ํ˜•ํƒœ๋Š” ๋งŒ๋“  ์‚ฌ๋žŒ์˜ ์„ฑ์˜ ์ฒซ ๊ธ€์ž๋งŒ ๋”ฐ์„œ ๋ถ€๋ฅด๋Š” ๊ฒƒ์ด๋‹ค. 
์˜ˆ๋ฅผ ๋“ค๋ฉด, KMP์ด๋‹ค.

๋™ํ˜์ด๋Š” ๋งค์ผ๋งค์ผ ์ž์‹ ์ด ํ•œ ์ผ์„ ๋ชจ๋‘ ๋ฉ”๋ชจ์žฅ์— ์ ์–ด๋†“๋Š”๋‹ค. 
์ž ์„ ์ž๊ธฐ ์ „์—, ์˜ค๋Š˜ ํ•˜๋ฃจ ๋ฌด์—‡์„ ํ–ˆ๋Š”์ง€ ๋˜์ƒˆ๊ฒจ ๋ณด๋Š” ๊ฒƒ์œผ๋กœ ํ•˜๋ฃจ๋ฅผ ๋งˆ๊ฐํ•œ๋‹ค.
ํ•˜๋ฃจ๋Š” ์ด ๋ฉ”๋ชจ๋ฅผ ๋ณด๋˜ ์ค‘, ์ง€๊ธˆ๊นŒ์ง€ ๊ธด ํ˜•ํƒœ์™€ ์งง์€ ํ˜•ํƒœ๋ฅผ ์„ž์–ด์„œ ์ ์–ด ๋†“์€ ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ๋‹ค.
์ด๋ ‡๊ฒŒ ๊ธด ํ˜•ํƒœ๋กœ ํ•˜๋ฃจ ์ผ์„ ๊ธฐ๋กํ•˜๋‹ค๊ฐ€๋Š” ๋ฉ”๋ชจ์žฅ ๊ฐ€๊ฒฉ์ด ๋ถ€๋‹ด๋˜์–ด ํŒŒ์‚ฐ๋  ๊ฒƒ์ด ๋ป”ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, 
์•ž์œผ๋กœ๋Š” ์งง์€ ํ˜•ํƒœ๋กœ ๊ธฐ๋กํ•˜๋ ค๊ณ  ํ•œ๋‹ค.

๊ธด ํ˜•ํƒœ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ด๋ฆ„์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ด๋ฅผ ์งง์€ ํ˜•ํƒœ๋กœ ๋ฐ”๊พธ์–ด ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค

์ž…๋ ฅ
์ž…๋ ฅ์€ ํ•œ ์ค„๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๊ณ , 
์ตœ๋Œ€ 100๊ธ€์ž์˜ ์˜์–ด ์•ŒํŒŒ๋ฒณ ๋Œ€๋ฌธ์ž, ์†Œ๋ฌธ์ž, ๊ทธ๋ฆฌ๊ณ  ํ•˜์ดํ”ˆ ('-', ์•„์Šคํ‚ค์ฝ”๋“œ 45)๋กœ๋งŒ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. 
์ฒซ ๋ฒˆ์งธ ๊ธ€์ž๋Š” ํ•ญ์ƒ ๋Œ€๋ฌธ์ž์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ , ํ•˜์ดํ”ˆ ๋’ค์—๋Š” ๋ฐ˜๋“œ์‹œ ๋Œ€๋ฌธ์ž์ด๋‹ค. 
๊ทธ ์™ธ์˜ ๋ชจ๋“  ๋ฌธ์ž๋Š” ๋ชจ๋‘ ์†Œ๋ฌธ์ž์ด๋‹ค.

์ถœ๋ ฅ
์ฒซ ์ค„์— ์งง์€ ํ˜•ํƒœ ์ด๋ฆ„์„ ์ถœ๋ ฅํ•œ๋‹ค.
*/

#define _CRT_SECURE_NO_WARNINGS
// ํ‘œ์ค€ ์ŠคํŠธ๋ฆผ์—์„œ ์ฝ๊ธฐ ๋ฐ ์“ฐ๊ธฐ๋ฅผ ์ œ์–ดํ•˜๋Š” ๊ฐœ์ฒด๋ฅผ ์„ ์–ธ
#include <iostream>
#include <algorithm>    // find
#include <string>
#include <cmath>        // abs
#include <vector>
#include <queue>
using namespace std;

int main() {
    string str;
    cin >> str;

    vector<char> vec;

    for (int i = 0; i < str.length(); i++) {
        if (str[i] == '-') {
            // ์˜์–ด ์•ŒํŒŒ๋ฒณ ๋Œ€๋ฌธ์ž, ์†Œ๋ฌธ์ž, ๊ทธ๋ฆฌ๊ณ  ํ•˜์ดํ”ˆ ('-', ์•„์Šคํ‚ค์ฝ”๋“œ 45)๋กœ๋งŒ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค
            vec.push_back(str[i + 1]);
        }
    }
    // ๋ฌธ์ž์—ด์˜ ์ฒซ๋ฒˆ์งธ ๋ฌธ์ž
    cout << str[0];

    // ๋ฌธ์ž์—ด์˜ '-' ๋‹ค์Œ ๋ฌธ์ž๋“ค
    for (int i = 0; i < vec.size(); i++) {
        cout << vec[i];
    }
	return 0;
}

728x90
๋ฐ˜์‘ํ˜•
Comments