[백준] 1305번 광고

2024. 11. 29. 19:19·백준 문제/KMP

문제: 1305번: 광고

 

#include <map>
#include <set>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <string>
#include <iostream>
#include <algorithm>
#include <iomanip> // setprecision을 사용하기 위한 헤더
#include <climits>

using namespace std;

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);

	// 어느 순간 전광판을 쳐다봤을 때, 가능한 광고의 길이 중 가장 짧은 것을 출력하는 문제
	// 즉, 전광판을 통해 생각해볼 수 있는 광고 문구 중에서 길이가 가장 짧은 걸 출력하면 됨.
	// 만약 현재 전광판의 문구가 aababba 이런 식이라고 했을 때, 가능한 가장 짧은 광고 문구는 어떻게 될까?
	// 일단 pi 배열을 이용하는 문제이다
	// a 일 땐 0, aa 일 땐 1, aab 일 땐 0, aaba 일 땐 1, aabab 일 땐 0, aababb 일 땐 0, aababba 일 땐 1
	// 이때 가능한 가장 짧은 광고 문구는 pi 의 맨 마지막 요소를 전광판의 크기에 빼주면 구할 수 있다.
	
	// 어떻게 이 풀이가 가능한가?
	// 문제 조건에서는 전광판을 다음과 같이 설명하고 있다. 
	// 전광판에는 광고가 흘러나오고 있다. 전광판에는 같은 내용의 문구가 무한히 반복되어 나온다.
	// 만약 광고하고 싶은 내용이 aaba 이고, 전광판 크기가 6이라면 맨 처음에 보이는 내용은 aabaaa
	// 왜? 광고문구는 무한히 이어져 있는데 6칸만 보여지므로
	// 즉, 현재 광고판을 봤을 때 aabaaa 에서 2를 빼면 aaba 를 구할 수 있음
	// 그렇다면 이 2라는 값은 어떻게 구하는가? 위에서 설명한 방식으로 구할 수 있음
	// a:0, aa:1, aab:0, aaba:1, aabaa:2, aabaaa:2
	// 즉, 6에 aabaaa 경우의 suffix 값을 빼주면 되는 것.

	int l; // 전광판 길이
	cin >> l;
	string advertisement;
	cin >> advertisement;

	int m = advertisement.size();
	vector<int> pi(m + 1);

	int i = 1;
	int j = 0;
	while (i < m) {
		if (advertisement[i] == advertisement[j]) {
			i++;
			j++;
			pi[i] = j;
		}
		else if (j == 0) {
			i++;
			pi[i] = 0;
		}
		else {
			j = pi[j];
		}
	}
	cout << l - pi[m];


	return 0;
}

 

진짜 KMP 문제라는 걸 알고 시작했는데도 불구하고 풀이 방법이 전혀 떠오르지 않았다. 애초에 문제가 이해가 되지 않았었다.

 

문제가 말하고 있는 바는, 현재 전광판에 나타난 문구를 보았을 때 이로부터 가능한 광고 문구 중 가장 짧은 문구의 길이를 출력하는 것이었다.

 

나는 처음에 전광판의 특징을 설명하는 부분에 꽂혀서 아 이건 알겠는데 이제 어떡하라고 라고 생각을 했는데, 전광판의 특성을 알았으니까 이제 전광판을 보고 광고 문구를 유추하는 문제였던 것이었다....

 

이 문제는 pi 배열의 값만 찾을 줄 알면 바로 풀리는 문제였다. 구현하는 건 정말 쉬운데 규칙을 찾아내는 것이  진!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!짜 어려운 부분인 것 같고, 이 문제의 난이도를 납득시키는 부분인 것 같다....

 

골드도 어려운데 플래티넘 문제 풀려고 하니까 어지럽다. 머리 딸려서 풀이 방법도 모르겠고 정말 가지가지 한다.... 하지만 골드 문제 처음 풀었을 때도 어질어질 했었는데 지금은 어느정도 괜찮으니까 얘도 계속 풀다보면 괜찮아지지 않을까... 앞으로도 열심히 해야겠다........ ㅠ_ㅠ  

 

 

 

참고자료:

[백준 1305] 광고 C++ — 개발냥발    

 

[백준 1305] 광고 C++

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

hyeo-noo.tistory.com

 

'백준 문제/KMP' 카테고리의 다른 글
  • [백준] 11585번 속타는 저녁 메뉴
  • [백준] 4354번 문자열 제곱
  • [백준] 1786번 찾기
dubu0721
dubu0721
dubu0721 님의 블로그 입니다.
  • dubu0721
    dubu0721 님의 블로그
    dubu0721
  • 전체
    오늘
    어제
    • 분류 전체보기 (335)
      • 프로그래밍언어론 정리 (0)
      • 컴퓨터네트워크 정리 (5)
      • 알고리즘&자료구조 공부 (64)
        • it 취업을 위한 알고리즘 문제풀이 입문 강의 (60)
        • 학교 알고리즘 수업 (3)
        • 실전프로젝트I (0)
      • 백준 문제 (193)
        • 이분탐색 (7)
        • 투포인트 (10)
        • 그래프 (7)
        • 그리디 (24)
        • DP (25)
        • BFS (15)
        • MST (7)
        • KMP (4)
        • Dijkstra (3)
        • Disjoints Set (4)
        • Bellman-Ford (2)
        • 시뮬레이션 (3)
        • 백트래킹 (15)
        • 위상정렬 (5)
        • 자료구조 (25)
        • 기하학 (1)
        • 정렬 (11)
        • 구현 (8)
        • 재귀 (8)
        • 수학 (8)
      • 유니티 공부 (11)
        • 레트로의 유니티 게임 프로그래밍 에센스 (11)
        • 유니티 스터디 자료 (0)
        • C# 공부 (0)
      • 유니티 프로젝트 (48)
        • 케이크게임 (13)
        • 점토게임 (35)
      • 언리얼 공부 (10)
        • 이득우의 언리얼 프로그래밍 (10)
      • 진로 (1)
      • 논문 읽기 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    유니티
    맵
    수학
    BFS
    오블완
    레트로의 유니티 프로그래밍
    해시
    언리얼
    우선순위큐
    티스토리챌린지
    그리디
    이득우
    시뮬레이션
    자료구조
    바킹독
    유니티 프로젝트
    백트래킹
    스택
    이벤트 트리거
    dp
    이분탐색
    C#
    그래프
    큐
    백준
    재귀
    투포인터
    유니티 공부 정리
    골드메탈
    정렬
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
dubu0721
[백준] 1305번 광고

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.