본문 바로가기
✨ 모든 웹/앱/게임 개발자를 위한 컴퓨터 구조 무료 강의, 제가 직접 준비했어요! 지금 바로 시작해볼까요?
Problem Solving/KMP

[KMP/파이썬] 백준 1097번 : 마법의 문자열 / 플래5

by ggyongi 2022. 4. 8.

https://www.acmicpc.net/problem/1097

 

1097번: 마법의 문자열

L개의 문자로 이루어진 문자열 T가 있다. T(i)는 T를 i (0 ≤ i < L)번째 문자부터 시작하게 부터 시작하게 원형 이동한 것이고, 길이는 T의 길이와 같다. 즉, 0 ≤ j < L을 만족하는 모든 j에 대해서, T(i)

www.acmicpc.net

import itertools
n = int(input())
words = []
for _ in range(n):
    words.append(input())
k = int(input())

def kmp(pattern, all_string):
    table = [0 for _ in range(len(pattern))]
    i = 0
    for j in range(1, len(pattern)):
        while i>0 and pattern[i]!=pattern[j]:
            i = table[i-1]

        if pattern[i]==pattern[j]:
            i += 1
            table[j] = i

    # kmp
    count = -1
    i = 0
    for j in range(len(all_string)):
        while i > 0 and pattern[i] != all_string[j]:
            i = table[i-1]

        if pattern[i] == all_string[j]:
            i += 1
            if i == len(pattern):
                count += 1
                i = table[i-1]
    return count == k

answer = 0
permutations = list(itertools.permutations(words, n))
for perm in permutations:
    a = ''.join(list(perm))a
    answer += kmp(a, a+a)
print(answer)

kmp로 풀 수 있다.

만든 문자열 a를 두번 연결시킨뒤 그 연결된 문자열에 대해 kmp로 패턴 등장 횟수를 찾아내면 된다.

강의 썸네일

📘 visionCS 시리즈

무료 공개! 컴퓨터 구조

흐름으로 배우는 CS 입문 강의

무료 강의 보러 가기

📘 비전공자 개발자 취업 성공기 시리즈

개발자가 되고 싶었던 한 비전공자의 1년 4개월 이야기
막막했던 시작부터 좌절, 그리고 합격까지의 여정을 기록했습니다

 

비전공자 네카라 신입 취업 노하우

시행착오 끝에 얻어낸 취업 노하우가 모두 담긴 전자책!

kmong.com

댓글