[Algorithm] ๐Ÿ”Ž๋ฐฑ์ค€ 1786 ์ฐพ๊ธฐ

HaJingJingยท2021๋…„ 7์›” 5์ผ
0

Algorithm

๋ชฉ๋ก ๋ณด๊ธฐ
92/119

0. ๋ฌธ์ œ

์›Œ๋“œํ”„๋กœ์„ธ์„œ ๋“ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ๋„์ค‘์— ์ฐพ๊ธฐ ๊ธฐ๋Šฅ์„ ์ด์šฉํ•ด ๋ณธ ์ผ์ด ์žˆ์„ ๊ฒƒ์ด๋‹ค. ์ด ๊ธฐ๋Šฅ์„ ์—ฌ๋Ÿฌ๋ถ„์ด ์‹ค์ œ๋กœ ๊ตฌํ˜„ํ•ด ๋ณด๋„๋ก ํ•˜์ž.

๋‘ ๊ฐœ์˜ ๋ฌธ์ž์—ด P์™€ T์— ๋Œ€ํ•ด, ๋ฌธ์ž์—ด P๊ฐ€ ๋ฌธ์ž์—ด T ์ค‘๊ฐ„์— ๋ช‡ ๋ฒˆ, ์–ด๋Š ์œ„์น˜์—์„œ ๋‚˜ํƒ€๋‚˜๋Š”์ง€ ์•Œ์•„๋‚ด๋Š” ๋ฌธ์ œ๋ฅผ '๋ฌธ์ž์—ด ๋งค์นญ'์ด๋ผ๊ณ  ํ•œ๋‹ค. ์›Œ๋“œํ”„๋กœ์„ธ์„œ์˜ ์ฐพ๊ธฐ ๊ธฐ๋Šฅ์€ ์ด ๋ฌธ์ž์—ด ๋งค์นญ ๋ฌธ์ œ๋ฅผ ํ’€์–ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋•Œ์˜ P๋Š” ํŒจํ„ด์ด๋ผ๊ณ  ๋ถ€๋ฅด๊ณ  T๋Š” ํ…์ŠคํŠธ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

ํŽธ์˜์ƒ T์˜ ๊ธธ์ด๋ฅผ n, P์˜ ๊ธธ์ด๋ฅผ m์ด๋ผ๊ณ  ํ•˜์ž. ์ผ๋ฐ˜์ ์œผ๋กœ, n โ‰ฅ m์ด๋ผ๊ณ  ๊ฐ€์ •ํ•ด๋„ ๋ฌด๋ฆฌ๊ฐ€ ์—†๋‹ค. n<m์ด๋ฉด ์–ด์ฐจํ”ผ P๋Š” T์ค‘๊ฐ„์— ๋‚˜ํƒ€๋‚  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋˜, T์˜ i๋ฒˆ์งธ ๋ฌธ์ž๋ฅผ T[i]๋ผ๊ณ  ํ‘œํ˜„ํ•˜๋„๋ก ํ•˜์ž. ๊ทธ๋Ÿฌ๋ฉด ๋ฌผ๋ก , P์˜ i๋ฒˆ์งธ ๋ฌธ์ž๋Š” P[i]๋ผ๊ณ  ํ‘œํ˜„๋œ๋‹ค.

โ€ƒย ย  1 2 3 4 5 6 7 8 9 โ€ฆ
T : [ A B C D A B C D A B D E ]
โ€ƒโ€ƒย |ย  |ย  |ย  |ย  |ย  |ย  X
P : [ A B C D A B D ]
โ€ƒย ย ย  1 2 3 4 5 6 7


๋ฌธ์ž์—ด P๊ฐ€ ๋ฌธ์ž์—ด T ์ค‘๊ฐ„์— ๋‚˜ํƒ€๋‚œ๋‹ค๋Š” ๊ฒƒ, ์ฆ‰ ๋ฌธ์ž์—ด P๊ฐ€ ๋ฌธ์ž์—ด T์™€ ๋งค์นญ์„ ์ด๋ฃฌ๋‹ค๋Š” ๊ฒƒ์ด ์–ด๋–ค ๊ฒƒ์ธ์ง€ ์œ„์™€ ์•„๋ž˜์˜ ๋‘ ์˜ˆ๋ฅผ ํ†ตํ•ด ์•Œ์•„๋ณด์ž. ์œ„์˜ ์˜ˆ์—์„œ P๋Š”, T์˜ 1๋ฒˆ ๋ฌธ์ž์—์„œ ์‹œ์ž‘ํ•˜๋Š” ๋งค์นญ์— ์‹คํŒจํ–ˆ๋‹ค. T์˜ 7๋ฒˆ ๋ฌธ์ž T[7]๊ณผ, P์˜ 7๋ฒˆ ๋ฌธ์ž P[7]์ด ์„œ๋กœ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์•„๋ž˜์˜ ์˜ˆ์—์„œ P๋Š”, T์˜ 5๋ฒˆ ๋ฌธ์ž์—์„œ ์‹œ์ž‘ํ•˜๋Š” ๋งค์นญ์— ์„ฑ๊ณตํ–ˆ๋‹ค. T์˜ 5๏ฝž11๋ฒˆ ๋ฌธ์ž์™€ P์˜ 1๏ฝž7๋ฒˆ ๋ฌธ์ž๊ฐ€ ์„œ๋กœ ํ•˜๋‚˜์”ฉ ๋Œ€์‘๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

โ€ƒย ย  1 2 3 4 5 6 7 8 9 โ€ฆ
T : [ A B C D A B C D A B D E ]
โ€ƒโ€ƒโ€ƒโ€ƒโ€ƒโ€ƒย |ย  |ย  |ย  |ย  |ย  |ย  |
P : โ€ƒโ€ƒโ€ƒย ย [ A B C D A B D ]
โ€ƒโ€ƒโ€ƒโ€ƒโ€ƒย ย  1 2 3 4 5 6 7


๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ, ์กด์žฌํ•˜๋Š” ๋ชจ๋“  ๋งค์นญ์„ ํ™•์ธํ•œ๋‹ค๋ฉด, ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ ๊นŒ? T์˜ 1๋ฒˆ ๋ฌธ์ž์—์„œ ์‹œ์ž‘ํ•˜๋Š” ๋งค์นญ์ด ๊ฐ€๋Šฅํ•œ์ง€ ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•ด์„œ, T์˜ 1๏ฝžm๋ฒˆ ๋ฌธ์ž์™€ P์˜ 1๏ฝžm๋ฒˆ ๋ฌธ์ž๋ฅผ ๋น„๊ตํ•œ๋‹ค๋ฉด ์ตœ๋Œ€ m๋ฒˆ์˜ ์—ฐ์‚ฐ์ด ํ•„์š”ํ•˜๋‹ค. ์ด ๋น„๊ต๋“ค์ด ๋๋‚œ ํ›„, T์˜ 2๋ฒˆ ๋ฌธ์ž์—์„œ ์‹œ์ž‘ํ•˜๋Š” ๋งค์นญ์ด ๊ฐ€๋Šฅํ•œ์ง€ ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•ด์„œ, T์˜ 2๏ฝžm+1๋ฒˆ ๋ฌธ์ž์™€ P์˜ 1๏ฝžm๋ฒˆ ๋ฌธ์ž๋ฅผ ๋น„๊ตํ•œ๋‹ค๋ฉด ๋‹ค์‹œ ์ตœ๋Œ€ m๋ฒˆ์˜ ์—ฐ์‚ฐ์ด ์ˆ˜ํ–‰๋œ๋‹ค. ๋งค์นญ์€ T์˜ n-m+1๋ฒˆ ๋ฌธ์ž์—์„œ๊นŒ์ง€ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰ํ•œ๋‹ค๋ฉด O( (n-m+1) ร— m ) = O(nm) ์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ–๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋œ๋‹ค.

๋” ์ข‹์€ ๋ฐฉ๋ฒ•์€ ์—†์„๊นŒ? ๋ฌผ๋ก  ์žˆ๋‹ค. ์œ„์— ์ œ์‹œ๋œ ์˜ˆ์—์„œ, T[7] โ‰  P[7] ์ด๋ฏ€๋กœ T์˜ 1๋ฒˆ ๋ฌธ์ž์—์„œ ์‹œ์ž‘ํ•˜๋Š” ๋งค์นญ์ด ์‹คํŒจ์ž„์„ ์•Œ๊ฒŒ ๋œ ์ˆœ๊ฐ„์œผ๋กœ ๋Œ์•„๊ฐ€์ž. ์ด๋•Œ ์šฐ๋ฆฌ๋Š” ๋งค์นญ์ด ์‹คํŒจ๋ผ๋Š” ์‚ฌ์‹ค์—์„œ, T[7] โ‰  P[7] ๋ผ๋Š” ์ •๋ณด๋งŒ์„ ์–ป์€ ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค. ์˜คํžˆ๋ ค i=1โ€ฆ6์— ๋Œ€ํ•ด T[i] = P[i] ๋ผ๊ณ  ํ•˜๋Š” ๊ท€์ค‘ํ•œ ์ •๋ณด๋ฅผ ์–ป์ง€ ์•Š์•˜๋Š”๊ฐ€? ์ด ์ •๋ณด๋ฅผ ์‹ญ๋ถ„ ํ™œ์šฉํ•˜๋ฉด, O(n)์˜ ์‹œ๊ฐ„๋ณต์žก๋„ ๋‚ด์— ๋ฌธ์ž์—ด ๋งค์นญ ๋ฌธ์ œ๋ฅผ ํ’€์–ด๋‚ด๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ๋‹ค.

P ๋‚ด๋ถ€์— ์กด์žฌํ•˜๋Š” ๋ฌธ์ž์—ด์˜ ๋ฐ˜๋ณต์— ์ฃผ๋ชฉํ•˜์ž. P์—์„œ 1, 2๋ฒˆ ๋ฌธ์ž A, B๋Š” 5, 6๋ฒˆ ๋ฌธ์ž๋กœ ๋ฐ˜๋ณต๋˜์–ด ๋‚˜ํƒ€๋‚œ๋‹ค. ๋˜, T์˜ 1๋ฒˆ ๋ฌธ์ž์—์„œ ์‹œ์ž‘ํ•˜๋Š” ๋งค์นญ์ด 7๋ฒˆ ๋ฌธ์ž์—์„œ์•ผ ์‹คํŒจํ–ˆ์œผ๋ฏ€๋กœ T์˜ 5, 6๋ฒˆ ๋ฌธ์ž๋„ A, B์ด๋‹ค.

๋”ฐ๋ผ์„œ T์˜ 1๋ฒˆ ๋ฌธ์ž์—์„œ ์‹œ์ž‘ํ•˜๋Š” ๋งค์นญ์ด ์‹คํŒจํ•œ ์ดํ›„, ๊ทธ ๋‹ค์Œ์œผ๋กœ ๊ฐ€๋Šฅํ•œ ๋งค์นญ์€ T์˜ 5๋ฒˆ ๋ฌธ์ž์—์„œ ์‹œ์ž‘ํ•˜๋Š” ๋งค์นญ์ž„์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค! ๋”๋ถˆ์–ด, T์˜ 5๏ฝž6๋ฒˆ ๋ฌธ์ž๋Š” P์˜ 1๏ฝž2๋ฒˆ ๋ฌธ์ž์™€ ๋น„๊ตํ•˜์ง€ ์•Š์•„๋„, ์„œ๋กœ ๊ฐ™๋‹ค๋Š” ๊ฒƒ์„ ์ด๋ฏธ ์•Œ๊ณ  ์žˆ๋‹ค! ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์ด์ œ๋Š” T์˜ 7๋ฒˆ ๋ฌธ์ž์™€ P์˜ 3๋ฒˆ ๋ฌธ์ž๋ถ€ํ„ฐ ๋น„๊ตํ•ด ๋‚˜๊ฐ€๋ฉด ๋œ๋‹ค.

์ด์ œ ์ด ๋ฐฉ๋ฒ•์„ ์ผ๋ฐ˜ํ™” ํ•ด ๋ณด์ž. T์˜ i๋ฒˆ ๋ฌธ์ž์—์„œ ์‹œ์ž‘ํ•˜๋Š” ๋งค์นญ์„ ๊ฒ€์‚ฌํ•˜๋˜ ์ค‘ T[i+j-1] โ‰  P[j]์ž„์„ ๋ฐœ๊ฒฌํ–ˆ๋‹ค๊ณ  ํ•˜์ž. ์ด๋ ‡๊ฒŒ P์˜ j๋ฒˆ ๋ฌธ์ž์—์„œ ๋งค์นญ์ด ์‹คํŒจํ•œ ๊ฒฝ์šฐ, P[1โ€ฆk] = P[j-kโ€ฆj-1]์„ ๋งŒ์กฑํ•˜๋Š” ์ตœ๋Œ€์˜ k(โ‰ j-1)์— ๋Œ€ํ•ด T์˜ i+j-1๋ฒˆ ๋ฌธ์ž์™€ P์˜ k+1๋ฒˆ ๋ฌธ์ž๋ถ€ํ„ฐ ๋น„๊ต๋ฅผ ๊ณ„์†ํ•ด ๋‚˜๊ฐ€๋ฉด ๋œ๋‹ค.

์ด ์ตœ๋Œ€์˜ k๋ฅผ j์— ๋Œ€ํ•œ ํ•จ์ˆ˜๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ , 1๏ฝžm๊นŒ์ง€์˜ ๊ฐ j๊ฐ’์— ๋Œ€ํ•ด ์ตœ๋Œ€์˜ k๋ฅผ ๋ฏธ๋ฆฌ ๊ณ„์‚ฐํ•ด ๋†“์œผ๋ฉด ํŽธ๋ฆฌํ•  ๊ฒƒ์ด๋‹ค. ์ด๋ฅผ ์ „์ฒ˜๋ฆฌ ๊ณผ์ •์ด๋ผ๊ณ  ๋ถ€๋ฅด๋ฉฐ, O(m)์— ์™„๋ฃŒํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋Ÿฌํ•œ ์›๋ฆฌ๋ฅผ ์ด์šฉํ•˜์—ฌ, T์™€ P๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ๋ฌธ์ž์—ด ๋งค์นญ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ
์ฒซ์งธ ์ค„์— ๋ฌธ์ž์—ด T๊ฐ€, ๋‘˜์งธ ์ค„์— ๋ฌธ์ž์—ด P๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. T์™€ P์˜ ๊ธธ์ด n, m์€ 1์ด์ƒ 100๋งŒ ์ดํ•˜์ด๊ณ , ์•ŒํŒŒ๋ฒณ ๋Œ€์†Œ๋ฌธ์ž์™€ ๊ณต๋ฐฑ์œผ๋กœ๋งŒ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.

์ถœ๋ ฅ
์ฒซ์งธ ์ค„์—, T ์ค‘๊ฐ„์— P๊ฐ€ ๋ช‡ ๋ฒˆ ๋‚˜ํƒ€๋‚˜๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์Œ์ด ์•„๋‹Œ ์ •์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ๋‘˜์งธ ์ค„์—๋Š” P๊ฐ€ ๋‚˜ํƒ€๋‚˜๋Š” ์œ„์น˜๋ฅผ ์ฐจ๋ก€๋Œ€๋กœ ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„ํ•ด ์ถœ๋ ฅํ•œ๋‹ค. ์˜ˆ์ปจ๋Œ€, T์˜ i๏ฝži+m-1๋ฒˆ ๋ฌธ์ž์™€ P์˜ 1๏ฝžm๋ฒˆ ๋ฌธ์ž๊ฐ€ ์ฐจ๋ก€๋กœ ์ผ์น˜ํ•œ๋‹ค๋ฉด, i๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ์‹์ด๋‹ค.

1. ์•„์ด๋””์–ด

๐Ÿ’ก KMP ์•Œ๊ณ ๋ฆฌ์ฆ˜
๐Ÿ’ก ์ ‘๋‘์‚ฌ ์ ‘๋ฏธ์‚ฌ ์ค‘๋ณต๋ถ€๋ถ„์„ ๊ตฌํ•˜๋Š” pi ๋ฐฐ์—ด์„ ๊ตฌํ•œ ํ›„, KMP ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ ์šฉ์‹œํ‚ด

2. ํ•ต์‹ฌ ํ’€์ด

  1. pi ๊ตฌํ•˜๊ธฐ
static void getPi() {
		int j = 0;
		for(int i=1; i<P.length(); i++) {
			while(j>0 && P.charAt(i) != P.charAt(j)) {
				j = pi[j-1];
			}
			
			if(P.charAt(i) == P.charAt(j)) {
				pi[i] = ++j;
			}
		}
	}
  1. KMP
static void KMP() {
		int j = 0;
		for(int i=0; i<T.length(); i++) {
			while(j>0 && T.charAt(i) != P.charAt(j)) {
				j = pi[j-1];
			}
			
			if(T.charAt(i) == P.charAt(j)) {
				if(j == P.length()-1) {
					count++;
					ret.add(i-P.length()+2);
					j = pi[j];
				} else {
					j++;
				}
			}
		}
	}

3. ์ฝ”๋“œ

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
public class Imple_15 {
	static String T, P;
	static int[] pi;
	static int count = 0;
	static ArrayList<Integer> ret = new ArrayList<>();
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		T = br.readLine();
		P = br.readLine();
		pi = new int[P.length()];
		
		getPi();
		KMP();
		
		System.out.println(count);
		
		for(int i : ret) {
			System.out.println(i);
		}
	}

	static void getPi() {
		int j = 0;
		for(int i=1; i<P.length(); i++) {
			while(j>0 && P.charAt(i) != P.charAt(j)) {
				j = pi[j-1];
			}
			
			if(P.charAt(i) == P.charAt(j)) {
				pi[i] = ++j;
			}
		}
	}
	
	static void KMP() {
		int j = 0;
		for(int i=0; i<T.length(); i++) {
			while(j>0 && T.charAt(i) != P.charAt(j)) {
				j = pi[j-1];
			}
			
			if(T.charAt(i) == P.charAt(j)) {
				if(j == P.length()-1) {
					count++;
					ret.add(i-P.length()+2);
					j = pi[j];
				} else {
					j++;
				}
			}
		}
	}
}

4. ๊ฒฐ๊ณผ

์„ฑ๊ณตโœจ

profile
๐ŸŒฑ์ดˆ๋ณด ๊ฐœ๋ฐœ์ž๐ŸŒฑ

0๊ฐœ์˜ ๋Œ“๊ธ€