알고리즘/Baekjoon
kmp. [7575]
jdaemanv2
2023. 4. 27. 00:09
[1. 문제 설명]
https://www.acmicpc.net/problem/7575
[2. 풀이 접근]
임의의 프로그램에 대해서, 발생 할 수 있는 K 개의 모든 코드를 구하고,
이 코드를 나머지 프로그램에서 찾는다.
- 문제에서는 코드 길이가 K 이상인 경우에도 바이러스라고 판정가능하다 하였는데,
- 사실 K 개만 일치하면, K개 보다 큰 경우에 대해서 코드 일치 여부와 관계 없이
- 바이러스 코드로 추정 할 수 있다.
# K+1 개, 일치 => K 개가 일치하므로 상관 없다.
# K+1 개. 불일치 => 역시 K 개는 일치하므로 상관 없다. - 일종의 함정인 셈
# K=4 라고 하면,
# K=5 코드, K=6 코드를 구할 필요가 없다.
연산 횟수를 대강 계산하면,
- 생성할 수 있는 코드 개수 : 1000개 (정확하게는 최대 996 개)
- 나머지 프로그램 개수: 100개 (정확하게는 최대 999개)
- 한 프로그램 당 정수 개수 : 1000개
- 전부 곱하면, 100,000,000 개
숫자가 좀 커서 시간초과가 발생할 것 같았으나,
테스트 머신의 cpu clock 이 1Ghz 라 가정하고,
1초의 0.5G 의 연산이 가능하다 생각하면, 대강 1억번의 연산은 1초안에 수행이 가능하다 볼 수 있다.(?)
- ??
고찰
- 최대 1억번의 연산은 1초 안에 해결 가능한 걸로 여기도록 한다.
- 플로이드-워셜 알고리즘의 경우 그 수행 횟수를 생각해보도록 한다.
- 최초 코드의 kmpSearch 에서, find 한 경우 이 때, begin 을 반환하도록 하였는데,
- 0번째 위치에서 m 개가 일치 할 수 있으므로, 이렇게 반환하는 것은 위험하다...
[3. 코드]