ํ์ ์๊ณ ๋ฆฌ์ฆ๊ณผ ํํ๋ง ์ฝ๋ฉ ๊ตฌํ ๋ฐฉ๋ฒ
ํ์ ์๊ณ ๋ฆฌ์ฆ๊ณผ ํํ๋ง ์ฝ๋ฉ ๊ตฌํ ๋ฐฉ๋ฒ ๊ด๋ จ
ํ์ ์๊ณ ๋ฆฌ์ฆ(Greedy Algorithm) ์ ๊ฐ ๋จ๊ณ์์ ์ต์ ์ ํด๊ฒฐ์ฑ ์ ์ ํํ์ฌ ๋ณต์กํ ๋ฌธ์ ๋ฅผ ๊ฐ๋จํ๊ณ ๋น ๋ฅด๊ฒ ํด๊ฒฐํ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋งํฉ๋๋ค. ์ด๋ฒ ๊ธ์์๋ ํ์ ์๊ณ ๋ฆฌ์ฆ์ ๊ธฐ๋ณธ ๊ฐ๋ ๊ณผ ์๋ ์๋ฆฌ๋ฅผ ์์๋ณด๊ณ , ์๊ณ ๋ฆฌ์ฆ์ ํ๊ณ์ ๊ณผ ์ ํฉํ ๋ฌธ์ ์ ํ์ ์ดํด๋ณด๊ณ ์ ํฉ๋๋ค. ๋๋ถ์ด ๋ฐ์ดํฐ ์์ถ ์ ์ฌ์ฉํ๋ ํํ๋ง ์ฝ๋ฉ(Huffman Coding) ์ ๊ฐ๋ ๊ณผ ํ์ ์๊ณ ๋ฆฌ์ฆ์ ์ ์ฉํด ํํ๋ง ์ฝ๋ฉ์ด ์ด๋ป๊ฒ ๊ตฌํ๋๋์ง๋ ํจ๊ป ์์๋ณด๊ฒ ์ต๋๋ค.
ํ์ ์๊ณ ๋ฆฌ์ฆ์ด๋?
1. ๊ธฐ๋ณธ ๊ฐ๋ ๋ฐ ํน์ง
ํ์ ์๊ณ ๋ฆฌ์ฆ์ ๋น์ฅ ์์ ๋์ฌ ์๋ ์ ํ์ง ์ค ๊ฐ์ฅ ์ต์ ์ธ ํด๋ฅผ ์ ํํ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋งํฉ๋๋ค. ์ด ์๊ณ ๋ฆฌ์ฆ์ ๋ค์ํ ์ต์ ํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐ ํ๋ ๋ฐ ์ฌ์ฉ๋๋ฉฐ, ๊ฐ ๋จ๊ณ์์ ๊ฐ์ฅ ์ข์ ๋ณด์ด๋ ์ ํ ์ ์ถ๊ตฌํ๊ธฐ ๋๋ฌธ์ ํ์ ์๊ณ ๋ฆฌ์ฆ์ด๋ผ๋ ์ด๋ฆ์ผ๋ก ๋ถ๋ฆฌ๊ณ ์์ต๋๋ค.
ํ์ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์์ธ์์ ๋ถ์ฐ๊น์ง ๊ฐ๋ ์ต๋จ ๋ฃจํธ๋ฅผ ์ฐพ๋ ๊ฒฝ์ฐ, ๋จผ์ ์์ธ์์ ๋์ ๊น์ง ๊ฐ๋ ๋๋ก ์ค ๊ฐ์ฅ ์งง์ ๋๋ก์ธ (A)๋ฅผ ์ ํํฉ๋๋ค.
๋ค์์ผ๋ก ๋์ ์์ ๋ถ์ฐ์ผ๋ก ๊ฐ๋ ๋๋ก ์ค ๊ฐ์ฅ ์งง์ ๋๋ก์ธ (D)๋ฅผ ์ ํํ์ฌ, ์ต์ข ์ ์ผ๋ก (A)-(D) ๋ฃจํธ๋ฅผ ์ ํํ๊ฒ ๋ฉ๋๋ค. ์ด์ฒ๋ผ ํ์ ์๊ณ ๋ฆฌ์ฆ์ ๊ฐ ๋จ๊ณ์์์ ์ต์ ์ ์ ํ์ด ์ ์ฒด์ ์ธ ์ต์ ํด๋ก ์ด์ด์ง๋ค๋ ๊ฐ์ ํ์ ์ ์ฉ๋๋ค๋ ํน์ง์ด ์์ต๋๋ค.
2. ์๋ ์๋ฆฌ์ ์ฅ๋จ์
์์ ์ดํด๋ดค๋ฏ์ด ํ์ ์๊ณ ๋ฆฌ์ฆ์ ์ ์ฒด ๋ฌธ์ ๋ฅผ ๋ถ๋ถ์ผ๋ก ์ชผ๊ฐ๊ณ , ๊ฐ ๋ถ๋ถ์์ ๊ฐ์ฅ ์ต์ ์ธ ์ ํ์ ํจ์ผ๋ก์จ ์ ์ฒด์ ์ธ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค. ์ฆ, ๋น์ฅ ์์ ์ฃผ์ด์ง ๋ถ๋ถ์ ์ธ ์ํฉ๋ง ๊ณ ๋ ค ํ๋ฉฐ, ์ ๋ฐ์ ์ธ ์ํฉ์ ์ ํ ๊ณ ๋ คํ์ง ์์ต๋๋ค. ๋ฐ๋ผ์ ํ์ ์๊ณ ๋ฆฌ์ฆ์ ๋ณต์กํ ๋ฌธ์ ๋ฅผ ๊ฐ๋จํ๊ณ ๋น ๋ฅด๊ฒ ํ ์ ์์ง๋ง, ๋ชจ๋ ๋ฌธ์ ์ ๋ํด ์ต์ ์ ํด๋ฅผ ๋ณด์ฅํ์ง๋ ์์ต๋๋ค.
๋ง์ฝ ์์ ๊ฐ์ด ๋์ ์ข ๋ฅ๋ก 500์, 400์, 100์, 10์์ง๋ฆฌ ๊ฐ ์๋ค๊ณ ๊ฐ์ ํ ๋, ์ต์์ ๋์ ์ ์ฌ์ฉํ์ฌ ๊ฑฐ์ค๋ฆ๋์ ์ง๋ถํ๋ ๋ฌธ์ ๋ฅผ ํ์ด๋ณด๊ฒ ์ต๋๋ค. ์ด ๋ฌธ์ ์ ํ์ ์๊ณ ๋ฆฌ์ฆ์ ์ ์ฉํ๋ฉด ๋จผ์ ๊ฐ์ฅ ๋จ์๊ฐ ํฐ 500์์ง๋ฆฌ๋ฅผ ๊ณ ๋ คํ๊ณ , ๋ค์์ผ๋ก 400์, 100์, 10์์ง๋ฆฌ ๋์ ์ ๊ณ ๋ คํ๊ฒ ๋ฉ๋๋ค. ์ด์ ๋ฐ๋ผ 810์์ ๊ฑฐ์ฌ๋ฌ ์ฃผ๋ ๊ฒฝ์ฐ 500์ 1๊ฐ, 100์ 3๊ฐ, 10์ 1๊ฐ๋ก ์ด 5๊ฐ์ ๋์ ์ ์ฌ์ฉํ๊ฒ ๋ฉ๋๋ค.
ํ์ง๋ง ์ด ๋ฌธ์ ์ ์ต์ ํด๋ 400์์ง๋ฆฌ 2๊ฐ์ 10์์ง๋ฆฌ 1๊ฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค. ์ด์ฒ๋ผ ํ์ ์๊ณ ๋ฆฌ์ฆ์ ๋ค๋ฅธ ๋ณต์กํ ์๊ณ ๋ฆฌ์ฆ์ ๋นํด ๊ฐ๋จํ๊ณ ๋น ๋ฅด์ง๋ง, 400์์ง๋ฆฌ ๋์ ์ด ์กด์ฌํ๋ ๊ฒฝ์ฐ์ ๊ฐ์ ์ํฉ์์๋ ํญ์ ์ต์ ํด๋ฅผ ๋ณด์ฅํ์ง ๋ชปํ๋ค ๋ ๋จ์ ์ด ์์ต๋๋ค.
ํ์ ์๊ณ ๋ฆฌ์ฆ ์กฐ๊ฑด๊ณผ ์ ์ฉ ๋ฐฉ๋ฒ
1. ํ์ ์๊ณ ๋ฆฌ์ฆ ์กฐ๊ฑด
ํ์ ์๊ณ ๋ฆฌ์ฆ์ ๋ชจ๋ ๋ฌธ์ ์ ๋ํด ํญ์ ์ต์ ํด๋ฅผ ๋ณด์ฅํ์ง ์์ง๋ง, ๋ค์ 2๊ฐ์ง ์กฐ๊ฑด ์ ์ถฉ์กฑํ๋ฉด ์ต์ ํด๋ฅผ ๋ณด์ฅํ ์ ์์ต๋๋ค.
ํ์์ ์ ํ ์์ฑ(Greedy Choice Property)
ํ์์ ์ ํ ์์ฑ์ด๋ '๊ฐ ๋จ๊ณ์ ์ ํ์ด ์ดํ ์ ํ์ ์ํฅ์ ์ฃผ์ง ์๋๋ค' ๋ผ๋ ๊ฒ์ ๋งํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์์ธ์์ ๋ถ์ฐ์ผ๋ก ๊ฐ๋ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ์์ ์์ธ์์ ๋์ ๊น์ง ๊ฐ๋ ๊ฒฝ๋ก๋ฅผ ์ ํํ๋ ๊ฒ์ด ๋์ ์์ ๋ถ์ฐ๊น์ง ๊ฐ๋ ๊ฒฝ๋ก๋ฅผ ์ ํํ๋ ๊ฒ์ ์ด๋ ํ ์ํฅ๋ ๋ฏธ์น์ง ์์ต๋๋ค. ์ด๋ฌํ ์์ฑ์ ๊ฐ์ง ๋ฌธ์ ๋ ํ์์ ์ ํ์ ๊ณ์ํ์ฌ ๊ฒฐ๊ตญ ์ต์ข ์ ์ผ๋ก ์ต์ ํด๋ฅผ ๊ตฌํ ์ ์์ต๋๋ค.
์ต์ ๋ถ๋ถ ๊ตฌ์กฐ(Optimal Substructure)
์ต์ ๋ถ๋ถ ๊ตฌ์กฐ๋ '๋ฌธ์ ์ ์ต์ข ํด๊ฒฐ์ฑ ์ด ๋ถ๋ถ ๋ฌธ์ ์ ์ต์ ํด ๋ก ๊ตฌ์ฑ๋ ์ ์์ด์ผ ํ๋ค'๋ผ๋ ๊ฒ์ ๋งํฉ๋๋ค. ์๋ฅผ ๋ค๋ฉด, ์์ธ์์ ๋ถ์ฐ๊น์ง ๊ฐ๋ ์ต๋จ ๊ฒฝ๋ก๋ ์์ธ์์ ๋์ ์ผ๋ก ๊ฐ๋ ์ต๋จ ๊ฒฝ๋ก์ ๋์ ์์ ๋ถ์ฐ์ผ๋ก ๊ฐ๋ ์ต๋จ ๊ฒฝ๋ก์ ํฉ์ผ๋ก ๊ตฌ์ฑ๋๋ค๋ ๊ฒ์ ๋ค ์ ์์ต๋๋ค. ์ด๋ฌํ ์กฐ๊ฑด์ ๊ฐ์ง๊ณ ์๋ ๋ฌธ์ ๋ ํ์ ์๊ณ ๋ฆฌ์ฆ์ ์ ์ฉํ์ฌ ์ต์ ํด๋ฅผ ๋์ถํ ์ ์์ต๋๋ค.
2. ํ์ ์๊ณ ๋ฆฌ์ฆ ์ ์ฉ ๋ฐฉ๋ฒ
์ด๋ค ๋ฌธ์ ์ ํ์ ์๊ณ ๋ฆฌ์ฆ์ ์ ์ฉํ๋ ค๋ฉด ์ฐ์ ํด๋น ๋ฌธ์ ๋ฅผ ์ฌ๋ฌ ๋ถ๋ถ์ผ๋ก ์ชผ๊ฐ์ผ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์์ ์ดํด๋ณธ ๋ ๊ฐ์ง ์กฐ๊ฑด์ธ ํ์์ ์ ํ ์์ฑ๊ณผ ์ต์ ๋ถ๋ถ ๊ตฌ์กฐ ์กฐ๊ฑด์ ์ถฉ์กฑํ๋์ง ์ดํด๋ด์ผ ํฉ๋๋ค. ์ฆ, ๊ฐ ๋จ๊ณ์ ์ ํ์ด ๋ค์ ๋จ๊ณ์ ์ ํ์ ์ํฅ์ ์ฃผ๋์ง, ๊ฐ ๋ถ๋ถ์ ์ต์ ํด๊ฐ ์ต์ข ์ ์ผ๋ก ์ ์ฒด ์ต์ ํด๋ฅผ ๊ตฌ์ฑํ๊ฒ ๋๋์ง๋ฅผ ํ์ธํด์ผ ํฉ๋๋ค.
์ฐธ๊ณ ๋ก ํ์ ์๊ณ ๋ฆฌ์ฆ์ ์๊ณ ๋ฆฌ์ฆ ๊ตฌํ์ด ์ฝ๊ณ ๋น ๋ฅด๊ธฐ ๋๋ฌธ์, ์ 2๊ฐ์ง ์กฐ๊ฑด์ ๋ง์กฑํ์ง ์๋๋ผ๋ ๋ค์ํ ๋ฌธ์ ์ ํ์ฉํ ์ ์์ต๋๋ค. ํนํ ๋ฐ๋์ ์ต์ ํด๋ฅผ ๊ตฌํ์ง ๋ชปํ๋๋ผ๋, ์ด๋ฆผ์ง์ํด์ ๋ต์ ๊ตฌํด์ผ ํ๋ ๊ฒฝ์ฐ ์๋ ์ฌ์ฉ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ธ๊ณต์ง๋ฅ์ ํ์ฉ๋๋ ์๊ณ ๋ฆฌ์ฆ ์ค ํด๋ฆฌ์คํฑ ํ์(Heuristic Search)์ด๋ ๋น ํ์(Beam Search), A* ์๊ณ ๋ฆฌ์ฆ ๋ฑ์์ ํ์ ์๊ณ ๋ฆฌ์ฆ์ด ์ ์ฉ๋๊ณ ์์ต๋๋ค.
ํํ๋ง ์ฝ๋ฉ๊ณผ ํ์ ์๊ณ ๋ฆฌ์ฆ
1. ํํ๋ง ์ฝ๋ฉ(Huffman Coding)๋?
ํํ๋ง ์ฝ๋ฉ์ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ์์ถ ํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ ๋งํฉ๋๋ค. ์ฌ๊ธฐ์ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ์์ถํ๋ค๋ ๊ฒ์ ํ ์คํธ, ์ค๋์ค, ๋น๋์ค ํ์ผ ๋ฑ์ ์ด์ง ์ฝ๋(Binary Code)๋ก ๋ณํํ ๋ ๊ธฐ์กด ๋ฐฉ์๋ณด๋ค ๋ ์ ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
์๋ฅผ ๋ค์ด, ์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ๋ฌธ์ ์ข ๋ฅ๋ก a, b, c๊ฐ ์๊ณ , ์ฃผ์ด์ง ๋ฌธ์์ด์ด aaababac์ธ ๊ฒฝ์ฐ๋ฅผ ์ดํด๋ณด๋๋ก ํ์ฃ . ๋จผ์ ์์คํค(ASCII)๋ ์ ๋์ฝ๋(Unicode) ๊ฐ์ ๊ธฐ์กด ๋ฐฉ์์ ํ ์คํธ๋ฅผ ์ด์ง ์ฝ๋๋ก ๋ณํํ ๋ ๊ฐ ๋ฌธ์์ ๋ํด ๊ณ ์ ๋ ๊ธธ์ด์ ์ด์ง ์ฝ๋ (Fixed-length Binary Code)๋ฅผ ๋ถ์ฌํฉ๋๋ค. ์ ์์์์๋ a, b, c ๋ชจ๋ 2๋นํธ์ ์ฝ๋๊ฐ ๋ถ์ฌ๋์์ต๋๋ค.
๋ฐ๋ฉด, ํํ๋ง ์ฝ๋ฉ์์๋ ๋ฌธ์์ ์ถํ ๋น๋์์ ๋ฐ๋ผ ๊ฐ๋ณ ๊ธธ์ด ์ฝ๋ (Variable-length Binary Code)๋ฅผ ๋ถ์ฌํฉ๋๋ค. ์ ์์์์๋ ์ถํ ๋น๋์๊ฐ ๊ฐ์ฅ ๋ง์ a๋ 1๋นํธ ์ฝ๋๋ก, ๋๋จธ์ง๋ 2๋นํธ ์ฝ๋๊ฐ ๋ถ์ฌ๋์์ต๋๋ค. ์ด๋ฅผ ํตํด ํํ๋ง ์ฝ๋ฉ์์๋ ๊ธฐ์กด ๋ฐฉ์๋ณด๋ค ๋ ์ ์ ๋ฉ๋ชจ๋ฆฌ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณํํ ์ ์๋ ๊ฒ์ด์ฃ .
2. ํ์ ์๊ณ ๋ฆฌ์ฆ์ ์ ์ฉ
์์ ์ดํด๋ดค๋ฏ์ด ํํ๋ง ์ฝ๋ฉ์์๋ ๋ฌธ์์ด ์ค ์์ฃผ ๋ฑ์ฅํ๋ ๋ฌธ์๋ ์งง์ ๋นํธ๋ก ํํํ๊ณ , ์๋์ ์ผ๋ก ์์ฃผ ๋ฑ์ฅํ์ง ์๋ ๋ฌธ์๋ ๊ธด ๋นํธ๋ก ํํํฉ๋๋ค. ์ฆ, ๊ฐ ๋ฌธ์์ ์ถํ ๋น๋์๋ฅผ ๊ธฐ๋ฐ ์ผ๋ก ํ์ ์๊ณ ๋ฆฌ์ฆ์ ์ ์ฉํ ๊ฒ์ ๋๋ค.
ํํ๋ง ์ฝ๋ฉ ๊ตฌํ ๋ฐฉ๋ฒ
1. ์ ์น ์ฝ๋์ ์ด์ง ํธ๋ฆฌ ํํ
ํํ๋ง ์ฝ๋ฉ์ ๊ฐ์ฅ ์ ์ ๋นํธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์์ด์ ์ด์ง ์ฝ๋๋ก ๋ณํํ๋ ์ผ์ข ์ ์ต์ ํ ๋ฌธ์ ์ ๋๋ค. ๋ฐ๋ผ์ ํํ๋ง ์ฝ๋ฉ์ผ๋ก ํญ์ ์ต์ ์ ํด๋ฅผ ๊ตฌํ๊ธฐ ์ํด์๋ ์์ ์ดํด๋ณธ ํ์ ์๊ณ ๋ฆฌ์ฆ์ 2๊ฐ์ง ์กฐ๊ฑด์ ๋ง์กฑํด์ผ ํฉ๋๋ค.
์ฒซ ๋ฒ์งธ ์กฐ๊ฑด์ธ ํ์ ์ ํ ์์ฑ์ ์์ ์ ํ์ด ๋ค์ ์ ํ์ ์ํฅ์ ๋ฏธ์น์ง ์์์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค. ํํ๋ง ์ฝ๋ฉ์์๋ ์ด๋ฅผ ์ ์น ์ฝ๋(prefix code)๋ผ๋ ๊ฐ๋ ์ ํตํด ์ถฉ์กฑ์ํค๊ณ ์์ต๋๋ค. ์ ์น ์ฝ๋๋ 'ํ ๋ฌธ์์ ์ฝ๋๊ฐ ๋ค๋ฅธ ๋ฌธ์ ์ฝ๋์ ์๋ถ๋ถ์ด ๋ ์ ์๋ค' ๋ผ๋ ๊ท์น์ ๊ฐ์ง ์ฝ๋๋ฅผ ๋งํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ด์ ์ ์ฝ๋ ์ ํ์ด ๋ค์ ์ฝ๋ ์ ํ์ ์ํฅ์ ๋ฏธ์น์ง ์๊ฒ ๋ฉ๋๋ค.
์๋ฅผ ๋ค์ด, a์ ์ฝ๋๊ฐ 0์ด๋ผ๋ฉด b๋ c์ ์ฝ๋ ์์๋ 0์ด ์ฌ ์ ์์ต๋๋ค. ์ด์ด์ b์ ์ฝ๋๊ฐ 10์ด๋ผ๋ฉด c ์ฝ๋ ์์๋ 10์ด ์ฌ ์ ์๋ ๊ฒ์ด์ฃ . ์ด๋ฌํ ์ ์น ์ฝ๋ ์กฐ๊ฑด์ ์์ ๊ฐ์ ์ด์ง ํธ๋ฆฌ๋ก ๊ฐ๋จํ ํํ ํ ์๋ ์์ต๋๋ค.
2. ์ต์ ๋ถ๋ถ ๊ตฌ์กฐ์ ์ต์ ํด ๊ตฌํ๊ธฐ
๋ค์์ผ๋ก ๋ ๋ฒ์งธ ์กฐ๊ฑด์ธ ์ต์ ๋ถ๋ถ ๊ตฌ์กฐ ์ ๊ดํด ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์ต์ ๋ถ๋ถ ๊ตฌ์กฐ๋ ์ด๋ค ๋ฌธ์ ์ ์ ์ฒด์ ์ธ ์ต์ ํด๊ฐ ๋ถ๋ถ ๋ฌธ์ ์ ์ต์ ํด์ ํฉ์ด๋ผ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ํํ๋ง ์ฝ๋ฉ์์๋ ์ ์ฒด ๋ฌธ์ ์ ์ต์ ํด๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ๊ฐ ๋ฌธ์์ ์ถํ ๋น๋์์ ์ฝ๋ ๊ธธ์ด๋ฅผ ๊ณฑํ ๊ฐ์ ์ดํฉ์ผ๋ก ๊ตฌํ ์ ์์ต๋๋ค.
์ ๊ณต์์ด ๋ค์ ๋ณต์กํด ๋ณด์ผ ์๋ ์์ง๋ง, ์์ ์์๋ฅผ ๋์ ํ๋ฉด ๊ฐ๋จํ๊ฒ ์ดํดํ ์ ์์ต๋๋ค. ์์ ์ดํด๋ณธ ์์์์ ํํ๋ง ์ฝ๋ฉ์ ์ ์ฉํ ๋ฌธ์์ด aaababac์ ์ ์ฒด ์ฝ๋ ๊ธธ์ด๋ 11๋นํธ์์ต๋๋ค. ์ด๋ a:() + b:() + c:() = 11๋ก ๊ณ์ฐ๋ ๊ฒ์ด์ฃ .
์ด๋ a๋ง ์์ ๋์ ์ต์ ํด์ธ , a์ b๋ง ์์ ๋์ ์ต์ ํด์ธ , ๋ง์ง๋ง์ผ๋ก a, b, c๊ฐ ์์ ๋์ ์ต์ ํด์ธ ์์ผ๋ก ์ ์ฒด์ ์ธ ์ต์ ํด๋ฅผ ๊ตฌํด ๋๊ฐ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ์ฆ, ํํ๋ง ์ฝ๋ฉ์ ๋ ๋ฒ์งธ ์กฐ๊ฑด์ธ ์ต์ ๋ถ๋ถ ๊ตฌ์กฐ๋ ๋ง์กฑํ๊ธฐ ๋๋ฌธ์ ํญ์ ์ต์ ์ ํด๋ฅผ ๋ณด์ฅํ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฌ๊ธฐ์ ์ต์ ํด๋ฅผ ๊ตฌํ๋ค๋ ๊ฒ์ ์ฌ๋ฌ ๊ฐ์ง ์ฝ๋ ์กฐํฉ ์ค ์ ์ฒด ๋ฌธ์์ด ์ฝ๋ ๊ธธ์ด๊ฐ ๊ฐ์ฅ ์ต์๊ฐ ๋๋ ๊ฐ ์ ๊ตฌํ๋ ๊ฒ์ ๋งํฉ๋๋ค.
3) ์๋ฐ ์ฝ๋ ๊ตฌํ ์์
์์ ์ดํด๋ณธ ๋ด์ฉ์ ํ ๋๋ก ์๋ฐ ์ฝ๋๋ฅผ ์์ฑํด ๋ณด๊ฒ ์ต๋๋ค. ๋จผ์ ๋ฌธ์์ ๋น๋์์ ๋ฐ๋ฅธ ์ด์ง ํธ๋ฆฌ๋ฅผ ์์ฑํ๊ธฐ ์ํด ์๋์ ๊ฐ์ด Node ํด๋์ค ๋ฅผ ์์ฑํฉ๋๋ค.
class Node {
char character;
int frequency;
Node left = null, right = null;
Node(char character, int frequency) {
this.character = character;
this.frequency = frequency;
}
Node(Node left, Node right) {
this.frequency = left.frequency + right.frequency;
this.left = left;
this.right = right;
}
}
๋ค์์ผ๋ก HuffmanCoding
ํด๋์ค๋ฅผ ๋ง๋ค๊ณ , ๊ฐ ๋ฌธ์์ ํด๋น ๋น๋์๋ฅผ ๊ฐ์ง ๋
ธ๋๋ฅผ ์ฐ์ ์์ ํ (Priority Queue)์ ์ถ๊ฐํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฐ์ ์์ ํ์์ ๋ ๋
ธ๋๋ฅผ ๊บผ๋ด์ด ๊ฒฐํฉํ๊ณ , ์ด๋ฅผ ๋ค์ ํ์ ์ถ๊ฐํ๋ ๊ณผ์ ์ ๋ฐ๋ณตํ์ฌ ์ด์ง ํธ๋ฆฌ๋ฅผ ๊ตฌ์ถํฉ๋๋ค.
public class HuffmanCoding {
// ํํ๋ง ์ด์ง ํธ๋ฆฌ ๊ตฌ์ถ
public static void buildHuffmanTree(String text) {
Map<Character, Integer> freq = new HashMap<>();
for (char c : text.toCharArray()) {
freq.put(c, freq.getOrDefault(c, 0)+1.;
}
// ์ด์ง ํธ๋ฆฌ๋ฅผ ๊ตฌ์ถํ๊ธฐ ์ํด ์ฐ์ ์์ ํ๋ฅผ ์ฌ์ฉ
PriorityQueue<Node> pq
= new PriorityQueue<>((l, r) -> l.frequency - r.frequency);
for (Map.entry<Character, Integer> entry: freq.entrySet()) {
pq.add(new Node(entry.getKey(), entry.getValue()));
}
// ์ด์งํธ๋ฆฌ ๊ตฌ์ถ
while(pq.size() != 1. {
Node left = pq.poll();
Node right = pq.poll();
pq.add(new Node(left, right));
}
printCodes(pq.peek(), "");
}
}
์ต์ข
์ ์ผ๋ก ์์ฑ๋ ์ด์ง ํธ๋ฆฌ๋ฅผ ํตํด ๊ฐ ๋ฌธ์์ ๋ํ ํํ๋ง ์ฝ๋๋ฅผ ๋ถ์ฌ ํ๊ณ , printCodes
๋ฉ์๋๋ฅผ ํตํด ๊ฐ ์ฝ๋๋ฅผ ์ถ๋ ฅํฉ๋๋ค. ๊ทธ๋ฌ๋ฉด ์๋์ ๊ฐ์ด aaababac
๋ฌธ์์ด์ ๋ํด a: 1, b: 01, c:00์ผ๋ก ์ต์ ์ด์ง ์ฝ๋ ๊ฐ ๋ถ์ฌ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค. ์ฐธ๊ณ ๋ก, ์ด ๊ฒฐ๊ณผ๋ 0๊ณผ 1๋ง ๋ฐ๊ฟ์ a: 0, b: 10, c: 11๊ณผ ๋์ผํ ๊ฒฐ๊ณผ์ด๊ธฐ๋ ํฉ๋๋ค.
// ํํ๋ง ์ฝ๋ ์ถ๋ ฅ
private static void printCodes(Node node, String str) {
if (node == null)
return;
if (node.left == null && node.right == null) {
System.out.println(node.character + ": " + str);
}
printCode(node.left, str + "0");
printCode(node.right, str + "1");
}
public class ClientForGreedyAlgorithms {
public static void main(String[] args) {
// ํํ๋ง ์ฝ๋ ์์ฑ
String text = "aaababac";
HuffmanCoding.buildHuffmanTree(text);
}
}
๋ง์น๋ฉฐ
์ง๊ธ๊น์ง ํ์ ์๊ณ ๋ฆฌ์ฆ์ ๊ธฐ๋ณธ ๊ฐ๋ ๊ณผ ์๋ ์๋ฆฌ, ๊ทธ๋ฆฌ๊ณ ํํ๋ง ์ฝ๋ฉ๊ณผ์ ๊ด๊ณ๋ฅผ ์ดํด๋ณด๊ณ ๊ฐ๋จํ๊ฒ ์๋ฐ ์ฝ๋๋ก ๊ตฌํํด ๋ณด์์ต๋๋ค. ์์ ์ดํด๋ณธ ๋ฐ์ ๊ฐ์ด ํ์ ์๊ณ ๋ฆฌ์ฆ์ ํ์ ์ ํ ์์ฑ๊ณผ ์ต์ ๋ถ๋ถ ๊ตฌ์กฐ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๊ฒฝ์ฐ ์ต์ ํ ๋ฌธ์ ๋ฅผ ํจ์จ์ ์ผ๋ก ํด๊ฒฐํ ์ ์๋ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค.
๋ํ ํํ๋ง ์ฝ๋ฉ ์ธ์๋ ์ฌ๋ฌ ๊ฐ์ง ์ค์ฉ์ ์ธ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉ๋๊ณ ์๋๋ฐ์. ํนํ ์ธ๊ณต์ง๋ฅ ๋ฐ ๋จธ์ ๋ฌ๋๊ณผ ๊ด๋ จ๋ ๋ค์ํ ์ต์ ํ ๋ฌธ์ ์ ์์ฌ ๊ฒฐ์ ํ๋ก์ธ์ค, ๊ทธ๋ฆฌ๊ณ ๋ณต์กํ ๋ฐ์ดํฐ ํจํด์ ํด์๊ณผ ๊ฐ์ ๋ฌธ์ ์๋ ํ์ฉ๋๊ณ ์์ผ๋, ๋ฏธ๋ฆฌ ํ์ตํด ๋๋ ๊ฒ์ ์ถ์ฒํฉ๋๋ค.