๋์ ๊ณํ๋ฒ (DP)O(M ร N)
1. LCS (์ต์ฅ ๊ณตํต ๋ถ๋ถ ์์ด) & Myers Diff
๋ ํ
์คํธ ์ํ์ค ์ฌ์ด์์ ์์๋ฅผ ์ ์งํ๋ฉฐ ์ผ์นํ๋ ๊ฐ์ฅ ๊ธด ๋ถ๋ถ ์์ด์ ์ฐพ๋ ํต์ฌ ์๊ณ ๋ฆฌ์ฆ์
๋๋ค. ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ ์ธ Uint32Array 2์ฐจ์ DP ํ
์ด๋ธ์ ๊ตฌ์ถํ์ฌ ์ต์ ํธ์ง ๊ฑฐ๋ฆฌ(Edit Distance)๋ฅผ ์ญ์ถ์ ํ๊ณ , ์ถ๊ฐ(Insert)ยท์ญ์ (Delete)ยท์ผ์น(Equal) ๋ธ๋ก์ ์๋ฒฝํ๊ฒ ํ๋ณํฉ๋๋ค.
DP[i+1][j+1] = eq(A[i], B[j]) ? DP[i][j] + 1 : Math.max(DP[i+1][j], DP[i][j+1])
- ์ค ๋จ์ 1์ฐจ ๋น๊ต ๋ฐ ๋ณ๊ฒฝ ์ฒญํฌ(Chunk) ๋ถํ
- ๊ณต๋ฐฑยท๋์๋ฌธ์ยท๋น์ค ์ต์
๋ณ ์ ๊ทํ ์ ์ฒ๋ฆฌ ๋ฐ์
2๋จ๊ณ ๊ณ์ธตํ ์ ๋ฐ ๋ถ์ํ ํฌ๋์ด์
2. ๋ค๋จ๊ณ ์ธ๋ผ์ธ ํ ํฐ ํ์ด๋ผ์ดํธ
์ค ๋จ์ ๋น๊ต๊ฐ ๋๋ ํ, ๋ณ๊ฒฝ๋(Modified) ์ค ๋ด๋ถ์์ ๋ค์ 2์ฐจ LCS๋ฅผ ์ํํ๋ ๊ณ์ธตํ ์ํคํ
์ฒ์
๋๋ค. ์ ๊ท์์ ํตํด ํ๊ธ ์์ , ์์ด ๋จ์ด, ๊ณต๋ฐฑ, ํน์๊ธฐํธ๋ฅผ ํ ํฐํํ์ฌ ์ค ์ ์ฒด๊ฐ ์๋ ์ค์ ๋ฐ๋ ๋จ์ดยท๋ฌธ์ ๋ถ๋ถ๋ง ์ ๋ฐํ๊ฒ ๊ฐ์กฐํฉ๋๋ค.
Regex: /(\s+|[a-zA-Z0-9_\u3131-\ud79d]+|[^\s\w])/g
- ๋จ์ด(Word) / ๋ฌธ์(Char) / ์ค ์ ์ฒด(Line) ๋ชจ๋ ์ ํ
<span class="hw-del"> & <span class="hw-ins"> ์ธ๋ผ์ธ ์์ ๋งคํ
๊ฐ์ ์ ๋ ฌ ๋งคํธ๋ฆญ์ค1:1 ์ํ ๋์นญ
3. ๊ฐ์ ์คํ์ด์(Ghost Spacer) ์ ๋ ฌ
ํ์ชฝ ํจ๋์ ์ค ์ถ๊ฐ๋ ์ญ์ ๊ฐ ์๊ธฐ๋ฉด ๋ง์ํธ์ ๋น์ด๋ฌด๋ฌ ๋น ๊ณต๊ฐ(.dline-empty)์ ๋์ ์ผ๋ก ์์ฑํ์ฌ ์ข์ฐ ๋์กฐ ์ค ๋ฒํธ์ ํ ๋์ด๋ฅผ ํญ์ 1:1 ์ํ์ผ๋ก ๋๊ธฐํํฉ๋๋ค. ๋น ๊ณต๊ฐ ํด๋ฆญ ์ ์ค์ด ๋ฐ๋ฆฌ๊ฑฐ๋ ์ ์ค์ด ์ถ๊ฐ๋์ง ์๊ณ ํด๋น ํ์์ ์ฆ์ ์ธ๋ผ์ธ ์์ ์ํ๋ก ํ์ฑํ๋ฉ๋๋ค.
left: { n: d.n, t: 'del' } โ right: { n: null, t: 'empty', insertIdx }
- ์๋ฒฝํ ์๋ฐฉํฅ ๋๊ธฐํ ์คํฌ๋กค (Sync Scroll) ์ ์ง
- ๋น ๊ณต๊ฐ ํด๋ฆญ ์ ์ค ๋ฐ๋ฆผ ์์ด ํด๋น ์์น์์ ์ฆ์ ์ธ๋ผ์ธ ์์ ๋ชจ๋ ํ์ฑํ
๋ฐ์ํ ์ํ ๋จธ์ ์ค์๊ฐ ํธ์ง
4. ์ํ ๋๊ธฐํ & ๋ค์ค ์ค ์ ํ ๋ชจ๋ธ
๋จ์ผ ํ์ฑ ์ธ๋ผ์ธ ์๋ํฐ์ ์ ์ฒด ํ
์คํธ ๋ชจ๋ธ(linesA, linesB)์ ์๋ฒฝํ ๋ถ๋ฆฌํ๊ณ , 250ms ๋๋ฐ์ด์ค ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํ์ดํ ์ง์ฐ ์์ด ๋ฐฑ๊ทธ๋ผ์ด๋ ์ฌ๊ณ์ฐ์ ์ํํฉ๋๋ค. ๋ง์ฐ์ค ๋๋๊ทธ ์ ์์/๋ ์ค๊ณผ ์ด์ ์ถ์ ํ๋ ์ ํ ๋ชจ๋ธ์ ํตํด ์ผ๊ด ๋ณต์ฌยท์ญ์ ยท์นํ์ ์ง์ํฉ๋๋ค.
Selection: { side, startLine, startCol, endLine, endCol }
- ์ค์๊ฐ Diff ์ฌ๊ณ์ฐ ์ค์๋ ์ปค์ ์์น(Caret Offset) ๋ฌด์์ค ์ ์ง
- ๋ฏธ๋ ํ๋กํ
์ก์
๋ฐ(๋ณต์ฌยท์๋ผ๋ด๊ธฐยท์ญ์ ) ๋ฐ ๋จ์ถํค ํตํฉ
์๊ฒฌ ๋ฐ ์ง๋ฌธ
0์์ง ๋ฑ๋ก๋ ์๊ฒฌ์ด ์์ต๋๋ค. ์ฒซ ๋ฒ์งธ ๋๊ธ์ ๋จ๊ฒจ๋ณด์ธ์!
๋๊ธ ์์
๋๊ธ ์ญ์