Henu
개발냥발
Henu
전체 방문자
오늘
어제
  • 분류 전체보기 (411)
    • DevOps (52)
      • Kubernetes (19)
      • Docker (14)
      • AWS (3)
      • Nginx (4)
      • Linux (4)
      • ArgoCD (1)
      • CN (2)
      • NATS (0)
      • Git (5)
    • Back-End (30)
      • Django (18)
      • Spring (5)
      • JPA (1)
      • MSA (5)
    • CS (87)
      • SystemSoftware (20)
      • OS (25)
      • Computer Architecture (16)
      • Network (23)
      • Database (2)
    • Lang (21)
      • Java (9)
      • Python (4)
      • C# (8)
    • Life (12)
    • 블록체인 (2)
    • Algorithm (204)
      • BOJ (160)
      • 프로그래머스 (19)
      • LeetCode (4)
      • SWEA (1)
      • 알고리즘 문제 해결 전략 (8)
      • DS, algorithms (7)
      • Checkio (5)
    • IT (2)

블로그 메뉴

  • GitHub
  • 글쓰기
  • 관리자

공지사항

  • Free!

인기 글

태그

  • 다이나믹 프로그래밍
  • boj
  • DFS
  • django
  • docker
  • BFS
  • 프로그래머스
  • Network
  • 백트래킹
  • Kubernetes

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Henu

개발냥발

[백준 1305] 광고 C++
Algorithm/BOJ

[백준 1305] 광고 C++

2021. 7. 28. 00:26
 

1305번: 광고

세준이는 길 한가운데에서 전광판을 쳐다보고 있었다. 전광판에는 광고가 흘러나오고 있었다. 한참을 전광판을 쳐다본 세준이는 이 광고가 의미하는 것이 무엇인지 궁금해지기 시작했다. 전광

www.acmicpc.net

KMP


15분 정도 뚫어져라 본 결과 규칙을 찾았다.

 

문자열의 마지막이 접두사와 중복된 채로 끝난다면 해당 중복 문자열의 길이만큼 광고 문자열을 감소시킬 수 있다.

 

babba 라는 문자열이 주어졌다고 가정.

접두사 table을 만들어보자

table = {0, 0, 1, 1, 2}

테이블의 마지막 값이 2이므로 해당 문자열은 마지막 2개가 중복된다고 볼 수 있다.

따라서 문자열의 길이 5에서 중복 문자열 2개를 제외한 3개가 답이 된다. -> bab

다음 광고가 중복되는 부분부터 시작할 수 있기 때문

 

babbac 라는 문자열이 주어졌다고 가정.

접두사 table을 만들면 table = {0, 0, 1, 1, 2, 0}

테이블의 마지막 값이 0이므로 해당 문자열은 다음 광고판에 접두사로 이어지지 못한다.

따라서 최대 광고 길이는 6 - 0 = 6이 된다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
 
int L;
string text, pattern;
vector<int> table;
 
int main(){
    cin >> L >> text;
    pattern = text;
    table.resize(L+1, 0);
    int j = 0;
    for(int i = 1; i < L; i++){
        while(j > 0 && pattern[j] != text[i]){
            j = table[j-1];
        }
        if(pattern[j] == text[i]){
            table[i] = ++j;
        }
    }
    
    cout << L - table[L-1];
    return 0;
}
 
Colored by Color Scripter
cs

 

'Algorithm > BOJ' 카테고리의 다른 글

[백준 2188] 축사 배정 (C++)  (0) 2021.07.30
[백준 11505] 구간 곱 구하기 (C++)  (0) 2021.07.29
[백준 1786] 찾기 C++  (0) 2021.07.27
[백준 4013] ATM C++  (1) 2021.07.27
[백준 1321] 군인 C++  (0) 2021.07.27
    'Algorithm/BOJ' 카테고리의 다른 글
    • [백준 2188] 축사 배정 (C++)
    • [백준 11505] 구간 곱 구하기 (C++)
    • [백준 1786] 찾기 C++
    • [백준 4013] ATM C++

    티스토리툴바