Algorithm Problem/Python

[python] ๋ฐฑ์ค€ - 16916. ๋ถ€๋ถ„ ๋ฌธ์ž์—ด

deo2kim 2020. 11. 3. 08:44
๋ฐ˜์‘ํ˜•

๐Ÿค”๋ฌธ์ œ ํ•ด๊ฒฐ

  • G4 | ๋ฌธ์ž์—ด, KMP

๋”ฑ ๋ด๋„ ๋„ˆ๋ฌด ์‰ฝ์ง€๋งŒ G5๋‹ˆ๊นŒ…. ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ํ’€์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.
๋“ค์–ด๋Š” ๋ดค์–ด๋„ ํ•œ ๋ฒˆ๋„ ์จ๋ณธ ์  ์—†๋Š” KMP ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์จ์•ผ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

KMP๋ฅผ ์“ฐ๋ฉด ๋ธŒ๋ฃจํŠธํฌ์Šค๋กœ ๋ฌธ์ž์—ด ํƒ์ƒ‰ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์•„์ฃผ ๋น ๋ฅด๋‹ค. O(M+N)
ํ•œ ์‹œ๊ฐ„ ๋„˜๊ฒŒ ์ฐพ์•„๊ฐ€๋ฉด์„œ ๊ณต๋ถ€ํ–ˆ์ง€๋งŒ ์„ค๋ช…ํ•˜๊ธฐ๋Š” ๋„ˆ๋ฌด ์–ด๋ ต๋‹ค. ์ดํ•ด๊ฐ€ ์ž˜ ์•ˆ ๋œ๋‹ค. ๋‚˜์ค‘์— ํ•œ ๋ฒˆ ๋” ๋ด์•ผ๊ฒ ๋‹ค.

๋Œ€์ถฉ ๋งํ•ด๋ณด์ž๋ฉด
๋น„์Šทํ•œ ํŒจํ„ด์„ ๊ธฐ์–ตํ•ด๋’€๋‹ค๊ฐ€ ํŒจํ„ด์„ ๋งŒ๋‚˜๋ฉด ์ ํ”„... (๋ฌด์Šจ ๋ง์ธ์ง€ ๋ชจ๋ฅด๊ฒ ๋‹ค)
์–ด์งธ ๋๋“  ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋งŽ์ด ์“ฐ์ด์ง„ ์•Š์ง€๋งŒ, ์ ๋‹นํžˆ ์•Œ์•„๋งŒ ๋‘๋ฉด ์ข‹์„ ๊ฑฐ ๊ฐ™๋‹ค.

 

๐Ÿ’ป์†Œ์Šค ์ฝ”๋“œ

def kmp_match(txt: str, pat: str) -> int:
    # ์Šคํ‚ตํ…Œ์ด๋ธ” ๋งŒ๋“ค๊ธฐ
    def make_skip_table(skip: list):
        pt = 1  # txt๋ฅผ ๋”ฐ๋ผ๊ฐ€๋Š” ์ธ๋ฑ์Šค
        pp = 0  # pat๋ฅผ ๋”ฐ๋ผ๊ฐ€๋Š” ์ธ๋ฑ์Šค
        while pt < len(pat):
            if pat[pt] == pat[pp]:
                pt += 1
                pp += 1
                skip[pt] = pp
            elif pp == 0:
                pt += 1
                skip[pt] = pp
            else:
                pp = skip[pp]

    # ๋ถ€๋ถ„ ๋ฌธ์ž์—ด ์ฐพ๊ธฐ (์ด ๋ฌธ์ œ์—์„œ๋Š” ์žˆ๋Š”์ง€ ์—†๋Š”์ง€๋งŒ ์ฐพ์œผ๋ฉด ๋œ๋‹ค.)
    def find_match_idx(txt: str, pat: str) -> int:
        pt = 0
        pp = 0
        while pt < len(txt) and pp < len(pat):
            if txt[pt] == pat[pp]:
                pt += 1
                pp += 1
            elif pp == 0:  # ๋” ์ด์ƒ ์•ž์œผ๋กœ ๋Œ์•„๊ฐˆ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ
                pt += 1
            else:
                pp = skip[pp]
        if pp == len(pat):
            return 1
        else:
            return 0

    skip = [0] * (len(pat) + 1)
    make_skip_table(skip)
    answer = find_match_idx(txt, pat)
    print(answer)


if __name__ == '__main__':
    S = input()
    P = input()
    kmp_match(S, P)
 

 

๐Ÿ“•๋ฌธ์ œ ํ™•์ธ

์ถœ์ฒ˜: BACKJOON ONLINE JUDGE

๋งํฌ: https://www.acmicpc.net/problem/16916

 

16916๋ฒˆ: ๋ถ€๋ถ„ ๋ฌธ์ž์—ด

์ฒซ์งธ ์ค„์— ๋ฌธ์ž์—ด S, ๋‘˜์งธ ์ค„์— ๋ฌธ์ž์—ด P๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋‘ ๋ฌธ์ž์—ด์€ ๋นˆ ๋ฌธ์ž์—ด์ด ์•„๋‹ˆ๋ฉฐ, ๊ธธ์ด๋Š” 100๋งŒ์„ ๋„˜์ง€ ์•Š๋Š”๋‹ค. ๋˜, ์•ŒํŒŒ๋ฒณ ์†Œ๋ฌธ์ž๋กœ๋งŒ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.

www.acmicpc.net

๋ฐ˜์‘ํ˜•