Amenable
Amenable's Blog
Amenable
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (189)
    • ๐Ÿ“‚ JAVA (87)
      • ์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ” (65)
      • ์ฃผ์š” ๊ฐœ๋… (22)
    • ๐Ÿ“‚ ๊ฐœ๋ฐœ ์„œ์  (22)
      • ์‹ค์šฉ์ฃผ์˜ ํ”„๋กœ๊ทธ๋ž˜๋จธ (1)
      • ๊ฐ์ฒด์ง€ํ–ฅ์˜ ์‚ฌ์‹ค๊ณผ ์˜คํ•ด (2)
      • ํด๋ฆฐ ์ฝ”๋“œ (8)
      • ํ•จ๊ป˜ ์ž๋ผ๊ธฐ (1)
      • ๊ทธ๋ฆผ์œผ๋กœ ๋ฐฐ์šฐ๋Š” HTTP&Network Basic (10)
    • ๐Ÿ“‚ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค (8)
      • ๊ฐœ๋… (8)
      • ๋ฌธ์ œํ’€์ด (0)
    • ๐Ÿ“‚ ๋„คํŠธ์›Œํฌ (14)
      • ๊ฐœ๋… (6)
      • ์„ฑ๊ณต๊ณผ ์‹คํŒจ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” 1%์˜ ๋„คํŠธ์›Œํฌ ์›๋ฆฌ (8)
    • ๐Ÿ“‚ ์Šคํ”„๋ง (13)
      • ๊ธฐ๋ณธ ๊ฐœ๋… (13)
    • ๐Ÿ“‚ WEB (5)
    • ๐Ÿ“‚ ์ž๋ฃŒ๊ตฌ์กฐ (12)
      • ๊ฐœ๋… (2)
      • ์ •๋ ฌ (8)
      • ํŠธ๋ฆฌ (2)
    • ๐Ÿ“‚ ์•Œ๊ณ ๋ฆฌ์ฆ˜ (10)
      • ์ตœ์†Œ์‹ ์žฅํŠธ๋ฆฌ (2)
      • ์ตœ๋‹จ ๊ฒฝ๋กœ (2)
      • ๋ฌธ์ž์—ด (2)
      • ETC (4)
    • ๐Ÿ“‚ ์•Œ๊ณ ๋ฆฌ์ฆ˜_๋ฌธ์ œํ’€์ด (4)
      • BOJ_๋ฐฑ์ค€ (4)
    • ๐Ÿ“‚ ํ”„๋กœ๊ทธ๋ž˜๋ฐ (3)
    • ๐Ÿ“‚ DevOps (2)
      • ๋ฐฐํฌ (2)
    • ๐Ÿ“‚ ํ›„๊ธฐ (8)
      • ์šฐ์•„ํ•œ ํ…Œํฌ์ฝ”์Šค(ํ”„๋ฆฌ์ฝ”์Šค) (4)
      • 2023๋…„ (3)
      • 2024๋…„ (1)
    • ๐Ÿ“‚ ํšŒ๊ณ  (1)
      • 2023๋…„ (1)

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ๐Ÿš€ GitHub

ํ‹ฐ์Šคํ† ๋ฆฌ

hELLO ยท Designed By ์ •์ƒ์šฐ.
Amenable
๐Ÿ“‚ ์•Œ๊ณ ๋ฆฌ์ฆ˜/๋ฌธ์ž์—ด

๋ณด์ด์–ด-๋ฌด์–ด(Boyer-Moore) ์•Œ๊ณ ๋ฆฌ์ฆ˜

๋ณด์ด์–ด-๋ฌด์–ด(Boyer-Moore) ์•Œ๊ณ ๋ฆฌ์ฆ˜
๐Ÿ“‚ ์•Œ๊ณ ๋ฆฌ์ฆ˜/๋ฌธ์ž์—ด

๋ณด์ด์–ด-๋ฌด์–ด(Boyer-Moore) ์•Œ๊ณ ๋ฆฌ์ฆ˜

2023. 4. 10. 21:28

1. ๊ฐœ๋… ๐Ÿ“ธ

  ๋ณด์ด์–ด-๋ฌด์–ด(Boyer-Moore) ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ skip์ด๋ผ๋Š” ๊ฒƒ์„ ํ™œ์šฉํ•œ ๋ฌธ์ž์—ด ๋งค์นญ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. ์—ฌ๊ธฐ์„œ skip์ด๋ž€ ๋ฌธ์ž์—ด์„ ๋น„๊ตํ•  ๋•Œ ๋ถˆํ•„์š”ํ•œ ๋น„๊ต๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ฑด๋„ˆ๋›ธ ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๊ฒƒ์ด๋‹ค. (์ •ํ™•ํ•œ ๋ช…์นญ์€ ์•„๋‹ˆ์ง€๋งŒ ์•„๋ž˜์˜ ๋™์ž‘๋ฐฉ์‹์„ ๋ณธ๋‹ค๋ฉด ์™œ skip์ด๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.)

  ๋ณด์ด์–ด-๋ฌด์–ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋ฌธ์ž์—ด์„ ๋น„๊ตํ•  ๋•Œ ์ผ๋ฐ˜์ ์œผ๋กœ ์•ž๋ถ€๋ถ„๋ณด๋‹ค๋Š” ๋’ท๋ถ€๋ถ„์—์„œ ๋ถˆ์ผ์น˜๊ฐ€ ์ผ์–ด๋‚  ํ™•๋ฅ ์ด ๋†’๋‹ค๋Š” ์„ฑ์งˆ์„ ํ™œ์šฉํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ๋น„๊ตํ•  ๋ฌธ์ž์—ด๊ณผ ํŒจํ„ด์„ ์•ž๋ถ€๋ถ„๋ถ€ํ„ฐ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ๋’ท๋ถ€๋ถ„๋ถ€ํ„ฐ ํ™•์ธํ•˜๊ฒŒ ๋œ๋‹ค.

 

2. ๋™์ž‘๋ฐฉ์‹ ๐ŸŽฌ

  ๊ธฐ๋ณธ์ ์ธ ๋™์ž‘๋ฐฉ์‹์€ ์ผ์น˜ํ•˜์ง€ ์•Š์€ ๋ฌธ์ž๋ฅผ ๋งŒ๋‚œ ๊ฒฝ์šฐ ํŒจํ„ด์—์„œ ์ผ์น˜ํ•˜๋Š” ๋ฌธ์ž๋ฅผ ์ฐพ์•„์„œ ์ด๋™ํ•œ ํ›„ ๋น„๊ต๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๋ณธ๋ฌธ์€ 'abphone' ํŒจํ„ด์€ 'phone'๋ผ๊ณ  ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๋™์ž‘ํ•œ๋‹ค.

  ์œ„์™€ ๊ฐ™์ด ๋ฌธ์ž๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—(o != e) ํŒจํ„ด์—์„œ o์™€ ์ผ์น˜ํ•˜๋Š” ๋ฌธ์ž๋ฅผ ์ฐพ์•„์„œ ์ด๋™ํ•œ ํ›„ ๋‹ค์‹œ ๋น„๊ต๋ฅผ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. (ํŒจํ„ด์— ์ผ์น˜ํ•˜๋Š” ๋ฌธ์ž๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ํŒจํ„ด์˜ ๊ธธ์ด๋งŒํผ ์ด๋™ํ•ด์•ผ ํ•œ๋‹ค.) ๊ฒฐ๊ตญ '๋ฌธ์ž๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์— ์–ผ๋งˆ๋งŒํผ ์ด๋™ํ•ด์•ผ ํ•˜๋Š”์ง€'์™€ '๋น„๊ต ์—ฐ์‚ฐ'๋งŒ ์ˆ˜ํ–‰ํ•˜๋ฉด ํ•ด๋‹น ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋™์ž‘ํ•œ๋‹ค.

  ์ด๋•Œ, '์–ผ๋งˆ๋งŒํผ ์ด๋™ํ•ด์•ผ ํ•˜๋Š”์ง€'๋ฅผ ์•Œ๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด skip ๋ฐฐ์—ด์ด๋‹ค. skip๋ฐฐ์—ด์€ ํ•ด๋‹น ๋ฌธ์ž๊ฐ€ ํŒจํ„ด์—์„œ ๋’ค์—์„œ ๋ช‡ ๋ฒˆ์งธ์— ์œ„์น˜ํ•˜๋Š”์ง€ ์•Œ๋ ค์ค€๋‹ค. skip์˜ ๊ฐ’์€ 'ํŒจํ„ด ๋ฌธ์ž์—ด์˜ ๊ธธ์ด - ๊ฐ ํŒจํ„ด ๋ฌธ์ž์˜ ์ธ๋ฑ์Šค - 1'์„ ๊ฐ€์ง„๋‹ค.

๋ฌธ์ž p h o n e ๋‹ค๋ฅธ ๋ชจ๋“  ๋ฌธ์ž
skip ๊ฐ’ 4 3 2 1 5 5

  ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๋ฌธ์ž๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์„ ๊ฒฝ์šฐ ์œ„์˜ skip ๋ฐฐ์—ด์„ ํ™œ์šฉํ•œ๋‹ค๋ฉด ์ฆ‰์‹œ ๋ช‡ ์นธ์„ ์ด๋™ํ•ด์•ผ ํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค. phone์„ ์‚ฌ์šฉํ•œ ์˜ˆ์ œ์—์„œ o์™€ e๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š์•˜์„ ๋•Œ 2์นธ์„ ์ด๋™ํ•œ ์ด์œ ๊ฐ€ skip ๋ฐฐ์—ด์—์„œ 'o'์˜ ๊ฐ’(=2)์„ ์ฐธ๊ณ ํ•˜์˜€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

  ๋‹ค์Œ์€ skip ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•ด์„œ ๋น ๋ฅด๊ฒŒ ํŒจํ„ด๊ณผ ์ผ์น˜ํ•˜๋Š” ๋ฌธ์ž์—ด์„ ์ฐพ๋Š” ์˜ˆ์ œ์ด๋‹ค.

  ์ฃผ์˜ํ•ด์„œ ๋ด์•ผ ํ•  ์ ์€ skip๊ฐ’๋งŒํผ ๋ณธ๋ฌธ ํฌ์ธํ„ฐ๊ฐ€ ์›€์ง์ธ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ํŒจํ„ด์ด ์ด๋™ํ•˜๋Š” ์นธ์˜ ๊ฐœ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋‹ค.

 

3. ๊ตฌํ˜„ ๐ŸŽฅ

public class BoyerMoore {
	
	static int BoyerMooreMatch(String str, String pattern) {
		int strCursor = 0;
		int patternCursor = 0;
		int strLen = str.length();
		int patternLen = pattern.length();
		int[] skip = new int[Character.MAX_VALUE + 1];
		
		// ํŒจํ„ด์— ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ = ํŒจํ„ด์˜ ๊ธธ์ด
		// ํŒจํ„ด์— ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ = skipํ•ด์•ผ ํ•˜๋Š” ์นธ์ˆ˜
		// ์— ํ•ด๋‹นํ•˜๋„๋ก skip ๋ฐฐ์—ด ์„ค์ •
		for(strCursor = 0; strCursor <= Character.MAX_VALUE; strCursor++) {
			skip[strCursor] = patternLen;
		}
		for(strCursor = 0; strCursor < patternLen - 1; strCursor++) {
			skip[pattern.charAt(strCursor)] = patternLen - strCursor - 1;
			System.out.println(pattern.charAt(strCursor) + " : " + (patternLen - strCursor - 1));
			
		}
		while(strCursor < strLen) {
			patternCursor = patternLen - 1;
			
			// ๋น„๊ตํ•˜๋Š” ๋ฌธ์ž์—ด๊ณผ ํŒจํ„ด์ด ๋’ค์—์„œ๋ถ€ํ„ฐ ๊ณ„์† ์ผ์น˜ํ•˜์—ฌ
			// cursor์˜ ๊ฐ’์„ ์ค„์ด๋ฉด์„œ ๊ณ„์† ๋น„๊ตํ•˜๋Š” ๊ณผ์ •
			while(str.charAt(strCursor) == pattern.charAt(patternCursor)) {
				if(patternCursor == 0) {
					// ํŒจํ„ด๊ณผ ์ผ์น˜ํ•˜๋Š” ๋ฌธ์ž์—ด์„ ์ฐพ์€ ๊ฒฝ์šฐ ์‹œ์ž‘ ์ธ๋ฑ์Šค๋ฅผ ๋ฐ˜ํ™˜
					return strCursor;
				}
				patternCursor--;
				strCursor--;
			}
			
			strCursor += Math.max(skip[str.charAt(strCursor)], patternLen - patternCursor);
		}
		
		return -1;
	}
	
	public static void main(String[] args) {
		String str = "abcaneczbphone";
		String pattern = "phone";
	}
}

 

4. ์‹œ๊ฐ„๋ณต์žก๋„ ๐Ÿ“ผ

  ์ฃผ์–ด์ง„ ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๊ฐ€ N์ด๊ณ  ํŒจํ„ด์˜ ๊ธธ์ด๊ฐ€ M์ด๋ผ๊ณ  ํ•  ๋•Œ, ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(NM)์ด๋‹ค. ๋ณธ๋ฌธ์ด AAAAAA์ด๊ณ  ํŒจํ„ด์ด BA์ผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ํ•˜์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” O(N) ๋ณด๋‹ค ๋Œ€์ฒด๋กœ ์ž‘๋‹ค. 

  ํ‰๊ท ์ ์œผ๋กœ ๋ณด์ด์–ด-๋ฌด์–ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ KMP ์•Œ๊ณ ๋ฆฌ์ฆ˜๋ณด๋‹ค ๋น ๋ฅธ ์„ฑ๋Šฅ์„ ๋ณด์ธ๋‹ค๊ณ  ์•Œ๋ ค์ ธ ์žˆ๊ณ  ๊ทธ๋กœ ์ธํ•ด ๊ฐ€์žฅ ๋งŽ์ด ์“ฐ์ด๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๊ธฐ๋„ ํ•˜๋‹ค.

 

ํ•ด๋‹น ๊ธ€์€
Chan ๋‹˜์˜ '์•Œ๊ณ ๋ฆฌ์ฆ˜ - ๋ณด์ด์–ด-๋ฌด์–ด ์•Œ๊ณ ๋ฆฌ์ฆ˜ : ๋ฌธ์ž์—ด ๊ฒ€์ƒ‰์„ ์œ„ํ•œ ๋˜๋‹ค๋ฅธ ์•Œ๊ณ ๋ฆฌ์ฆ˜',
์•ผ์ธ์ฝ”๋”ฉ ๋‹˜์˜ '๋ณด์ด์–ด ๋ฌด์–ด(Boyer-Moore) ๋ฌธ์ž์—ด ๊ฒ€์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜'
์„ ์ฐธ๊ณ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

'๐Ÿ“‚ ์•Œ๊ณ ๋ฆฌ์ฆ˜ > ๋ฌธ์ž์—ด' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

๋ผ๋นˆ-์นดํ”„(Rabin-Karp) ์•Œ๊ณ ๋ฆฌ์ฆ˜  (1) 2023.04.09
  • 1. ๊ฐœ๋… ๐Ÿ“ธ
  • 2. ๋™์ž‘๋ฐฉ์‹ ๐ŸŽฌ
  • 3. ๊ตฌํ˜„ ๐ŸŽฅ
  • 4. ์‹œ๊ฐ„๋ณต์žก๋„ ๐Ÿ“ผ
'๐Ÿ“‚ ์•Œ๊ณ ๋ฆฌ์ฆ˜/๋ฌธ์ž์—ด' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • ๋ผ๋นˆ-์นดํ”„(Rabin-Karp) ์•Œ๊ณ ๋ฆฌ์ฆ˜
Amenable
Amenable
CS, ์ž๋ฐ”, ์ž๋ฃŒ๊ตฌ์กฐ, ์•Œ๊ณ ๋ฆฌ์ฆ˜, ์Šคํ”„๋ง, ์Šคํ”„๋ง ๋ถ€ํŠธ์— ํ•ด๋‹นํ•˜๋Š” ๊ฐœ๋ฐœ์— ๊ด€ํ•œ ๋‚ด์šฉ์„ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”

๋‹จ์ถ•ํ‚ค

๋‚ด ๋ธ”๋กœ๊ทธ

๋‚ด ๋ธ”๋กœ๊ทธ - ๊ด€๋ฆฌ์ž ํ™ˆ ์ „ํ™˜
Q
Q
์ƒˆ ๊ธ€ ์“ฐ๊ธฐ
W
W

๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๊ธ€

๊ธ€ ์ˆ˜์ • (๊ถŒํ•œ ์žˆ๋Š” ๊ฒฝ์šฐ)
E
E
๋Œ“๊ธ€ ์˜์—ญ์œผ๋กœ ์ด๋™
C
C

๋ชจ๋“  ์˜์—ญ

์ด ํŽ˜์ด์ง€์˜ URL ๋ณต์‚ฌ
S
S
๋งจ ์œ„๋กœ ์ด๋™
T
T
ํ‹ฐ์Šคํ† ๋ฆฌ ํ™ˆ ์ด๋™
H
H
๋‹จ์ถ•ํ‚ค ์•ˆ๋‚ด
Shift + /
โ‡ง + /

* ๋‹จ์ถ•ํ‚ค๋Š” ํ•œ๊ธ€/์˜๋ฌธ ๋Œ€์†Œ๋ฌธ์ž๋กœ ์ด์šฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ํ‹ฐ์Šคํ† ๋ฆฌ ๊ธฐ๋ณธ ๋„๋ฉ”์ธ์—์„œ๋งŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.