GSoC 2019: ์ด๋ถ„๋ฒ• ๋ฐ ๋ชจ๋‚˜๋“œ ๋ณ€ํ™˜๊ธฐ์— ๋Œ€ํ•œ ๊ทธ๋ž˜ํ”„ ํ™•์ธ

์ง€๋‚œ ์—ฌ๋ฆ„์— ์ œ๊ฐ€ ์ฐธ์—ฌํ–ˆ๋˜ ์ฝ”๋“œ์˜ ๊ตฌ๊ธ€ ์—ฌ๋ฆ„ - Google ํ•™์ƒ๋“ค์„ ์œ„ํ•œ ํ”„๋กœ๊ทธ๋žจ์ž…๋‹ˆ๋‹ค. ๋งค๋…„ ์ฃผ์ตœ์ธก์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ž˜ ์•Œ๋ ค์ง„ ์กฐ์ง์„ ํฌํ•จํ•˜์—ฌ ์—ฌ๋Ÿฌ ์˜คํ”ˆ ์†Œ์Šค ํ”„๋กœ์ ํŠธ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. Boost.org ะธ ๋ฆฌ๋ˆ…์Šค ์žฌ๋‹จ. Google์€ ์ด๋Ÿฌํ•œ ํ”„๋กœ์ ํŠธ์— ์ฐธ์—ฌํ•˜๋„๋ก ์ „ ์„ธ๊ณ„์˜ ํ•™์ƒ๋“ค์„ ์ดˆ๋Œ€ํ•ฉ๋‹ˆ๋‹ค. 

Google Summer of Code 2019์— ์ฐธ์—ฌํ•˜์—ฌ ๋„์„œ๊ด€ ๋‚ด์—์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ์•Œ๊ฐ€ ์กฐ์ง๊ณผ ํ•จ๊ป˜ Haskell.org, ๊ฐ€์žฅ ์œ ๋ช…ํ•œ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ์ค‘ ํ•˜๋‚˜์ธ Haskell ์–ธ์–ด๋ฅผ ๊ฐœ๋ฐœํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Alga๋Š” ๋‹ค์Œ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค. ์•ˆ์ „ํ•œ ํƒ€์ž… Haskell์˜ ๊ทธ๋ž˜ํ”„ ํ‘œํ˜„. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์‹œ๋งจํ‹ฑ โ€” ์ฝ”๋“œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์˜๋ฏธ ์ฒด๊ณ„, ํ˜ธ์ถœ ๋ฐ ์ข…์†์„ฑ ๊ทธ๋ž˜ํ”„๋ฅผ ๊ตฌ์ถ•ํ•˜๊ณ  ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋Š” Github ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค. ๋‚ด ํ”„๋กœ์ ํŠธ๋Š” ์ด๋ถ„ ๊ทธ๋ž˜ํ”„์— ๋Œ€ํ•œ ์œ ํ˜• ์•ˆ์ „ ํ‘œํ˜„๊ณผ ํ•ด๋‹น ํ‘œํ˜„์— ๋Œ€ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. 

์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” Haskell์—์„œ ๊ทธ๋ž˜ํ”„์˜ ์ด๋ถ„์„ฑ์„ ํ™•์ธํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ๊ฒƒ ์ค‘ ํ•˜๋‚˜์ž„์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ด๋ฅผ ๊ธฐ๋Šฅ์  ์Šคํƒ€์ผ๋กœ ์•„๋ฆ„๋‹ต๊ฒŒ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด ์—ฌ๋Ÿฌ ๋ฒˆ์˜ ๋ฐ˜๋ณต์ด ํ•„์š”ํ–ˆ๊ณ  ๊ฝค ๋งŽ์€ ์ž‘์—…์ด ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ €๋Š” ๋ชจ๋‚˜๋“œ ๋ณ€ํ™˜๊ธฐ๋ฅผ ์‚ฌ์šฉํ•œ ๊ตฌํ˜„์„ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. 

GSoC 2019: ์ด๋ถ„๋ฒ• ๋ฐ ๋ชจ๋‚˜๋“œ ๋ณ€ํ™˜๊ธฐ์— ๋Œ€ํ•œ ๊ทธ๋ž˜ํ”„ ํ™•์ธ

์„ฑ๋ช…์„œ

์ œ ์ด๋ฆ„์€ Vasily Alferov์ด๊ณ  ์ƒํŠธํŽ˜ํ…Œ๋ฅด๋ถ€๋ฅดํฌ HSE์˜ XNUMXํ•™๋…„ ํ•™์ƒ์ž…๋‹ˆ๋‹ค. ์ œ๊ฐ€ ์˜ˆ์ „์— ๋ธ”๋กœ๊ทธ์— ์ผ๋˜ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๊ด€ํ•œ ๋‚ด ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•ด ะธ ZuriHac ์—ฌํ–‰์— ๋Œ€ํ•ด. ์ง€๊ธˆ์€ ์ธํ„ด์‹ญ ์ค‘์ด์—์š”. ๋ฒ ๋ฅด๊ฒ๋Œ€ํ•™๊ต ๋…ธ๋ฅด์›จ์ด์—์„œ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์—ฐ๊ตฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชฉ๋ก ์ƒ‰์น ํ•˜๊ธฐ. ๋‚ด ๊ด€์‹ฌ ๋ถ„์•ผ์—๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋œ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌํ˜„์— ๋Œ€ํ•ด

๋จธ๋ฆฌ๋ง

ํ”„๋กœ๊ทธ๋žจ์— ์ฐธ์—ฌํ•˜๋Š” ํ•™์ƒ๋“ค์€ ๋ธ”๋กœ๊ทธ ํ™œ๋™์„ ์ ๊ทน ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๋‚˜์—๊ฒŒ ๋ธ”๋กœ๊ทธ ํ”Œ๋žซํผ์„ ์ œ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค ํ•˜์Šค์ผˆ์˜ ์—ฌ๋ฆ„. ์ด ๊ธ€์€ ๋ฒˆ์—ญ๋ณธ์ž…๋‹ˆ๋‹ค ์กฐํ•ญ, ์งง์€ ์„œ๋ฌธ๊ณผ ํ•จ๊ป˜ ์ œ๊ฐ€ XNUMX์›”์— ๊ทธ๊ณณ์—์„œ ์˜์–ด๋กœ ์ผ์Šต๋‹ˆ๋‹ค. 

๋ฌธ์ œ์˜ ์ฝ”๋“œ๊ฐ€ ํฌํ•จ๋œ Pull Request๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—.

๋‚ด ์ž‘์—… ๊ฒฐ๊ณผ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜์–ด). ์—ฌ๊ธฐ์—.

์ด ๊ฒŒ์‹œ๋ฌผ์€ ๋…์ž๊ฐ€ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๊ธฐ๋ณธ ๊ฐœ๋…์— ์ต์ˆ™ํ•ด์ง€๋„๋ก ์˜๋„๋˜์—ˆ์ง€๋งŒ, ๋•Œ๊ฐ€ ๋˜๋ฉด ์‚ฌ์šฉ๋œ ๋ชจ๋“  ์šฉ์–ด๋ฅผ ๊ธฐ์–ตํ•ด๋‚ด๋ ค๊ณ  ๋…ธ๋ ฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ž˜ํ”„์˜ ์ด๋ถ„์„ฑ ํ™•์ธ 

๊ทธ๋ž˜ํ”„์˜ ์ด๋ถ„์„ฑ์„ ํ™•์ธํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๊ทธ๋ž˜ํ”„ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ค‘ ํ•˜๋‚˜๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ฐ•์ขŒ์—์„œ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ๊ทธ์˜ ์•„์ด๋””์–ด๋Š” ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ๋จผ์ € ์–ด๋–ป๊ฒŒ๋“  ์™ผ์ชฝ์ด๋‚˜ ์˜ค๋ฅธ์ชฝ ๊ณต์œ ์— ์ •์ ์„ ๋ฐฐ์น˜ํ•˜๊ณ  ์ถฉ๋Œํ•˜๋Š” ๊ฐ€์žฅ์ž๋ฆฌ๊ฐ€ ๋ฐœ๊ฒฌ๋˜๋ฉด ๊ทธ๋ž˜ํ”„๊ฐ€ ์ด๋ถ„ํ˜•์ด ์•„๋‹ˆ๋ผ๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค.

์กฐ๊ธˆ ๋” ์ž์„ธํžˆ ์„ค๋ช…ํ•˜์ž๋ฉด ๋จผ์ € ์™ผ์ชฝ ๊ณต์œ ์— ์ •์ ์„ ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ ์ด ๊ผญ์ง€์ ์˜ ๋ชจ๋“  ์ด์›ƒ์€ ์˜ค๋ฅธ์ชฝ ์—ฝ์— ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, ์ด ์ •์ ์˜ ์ด์›ƒ์˜ ๋ชจ๋“  ์ด์›ƒ์€ ์™ผ์ชฝ ์—ฝ์— ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์‹œ์ž‘ํ•œ ์ •์ ์˜ ์—ฐ๊ฒฐ๋œ ๊ตฌ์„ฑ ์š”์†Œ์— ์ด์›ƒ์„ ํ• ๋‹นํ•˜์ง€ ์•Š์€ ์ •์ ์ด ์—ฌ์ „ํžˆ ์žˆ๋Š” ํ•œ ์ •์ ์— ๊ณต์œ ๋ฅผ ๊ณ„์† ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•ด ์ด ์ž‘์—…์„ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค.

๋™์ผํ•œ ๋ถ„ํ• ์— ์†ํ•˜๋Š” ์ •์  ์‚ฌ์ด์— ๊ฐ„์„ ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ๊ทธ๋ž˜ํ”„์—์„œ ํ™€์ˆ˜ ์‚ฌ์ดํด์„ ์ฐพ๋Š” ๊ฒƒ์ด ์–ด๋ ต์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ด๋ถ„ ๊ทธ๋ž˜ํ”„์—์„œ๋Š” ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์ด ๋„๋ฆฌ ์•Œ๋ ค์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์˜ฌ๋ฐ”๋ฅธ ๋ถ„ํ• ์ด ์žˆ์œผ๋ฉฐ ์ด๋Š” ๊ทธ๋ž˜ํ”„๊ฐ€ ์ด๋ถ„ํ˜•์ž„์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค. ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰ ๋˜๋Š” ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰. ๋ช…๋ นํ˜• ์–ธ์–ด์—์„œ๋Š” ๊นŠ์ด ์šฐ์„  ๊ฒ€์ƒ‰์ด ์•ฝ๊ฐ„ ๋” ๊ฐ„๋‹จํ•˜๊ณ  ์ถ”๊ฐ€ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋” ์ „ํ†ต์ ์ธ ๊นŠ์ด ์šฐ์„  ๊ฒ€์ƒ‰์„ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณ„ํš์„ ์„ธ์› ์Šต๋‹ˆ๋‹ค. ๊นŠ์ด ์šฐ์„  ๊ฒ€์ƒ‰์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ทธ๋ž˜ํ”„์˜ ๊ผญ์ง€์ ์„ ํƒ์ƒ‰ํ•˜๊ณ  ๊ณต์œ ๋ฅผ ํ• ๋‹นํ•˜์—ฌ ๊ฐ€์žฅ์ž๋ฆฌ๋ฅผ ๋”ฐ๋ผ ์ด๋™ํ•  ๋•Œ ๊ณต์œ ์˜ ์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ ๊ณต์œ ๊ฐ€ ํ• ๋‹น๋œ ์ •์ ์— ๊ณต์œ ๋ฅผ ํ• ๋‹นํ•˜๋ ค๊ณ  ํ•˜๋ฉด ๊ทธ๋ž˜ํ”„๊ฐ€ ์ด๋ถ„ํ˜•์ด ์•„๋‹ˆ๋ผ๊ณ  ์•ˆ์ „ํ•˜๊ฒŒ ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ผญ์ง€์ ์— ๊ณต์œ ๊ฐ€ ํ• ๋‹น๋˜๊ณ  ๋ชจ๋“  ๊ฐ€์žฅ์ž๋ฆฌ๋ฅผ ์‚ดํŽด๋ณธ ์ˆœ๊ฐ„ ์ข‹์€ ํŒŒํ‹ฐ์…˜์„ ๊ฐ–๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๊ณ„์‚ฐ์˜ ์ˆœ์ˆ˜์„ฑ

Haskell์—์„œ๋Š” ๋ชจ๋“  ๊ณ„์‚ฐ์ด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊นจ๋—ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์ด ์‚ฌ์‹ค์ด๋ผ๋ฉด ํ™”๋ฉด์— ์•„๋ฌด๊ฒƒ๋„ ์ธ์‡„ํ•  ๋ฐฉ๋ฒ•์ด ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์กฐ๊ธˆ๋„, ๊นจ๋—ํ•œ ๊ณ„์‚ฐ์ด ๋„ˆ๋ฌด ๊ฒŒ์œผ๋ฅธ๋ฐ ํ•˜๋‚˜๋„ ์—†๋„ค ๊นจ๋—ํ•œ ๋ฌด์–ธ๊ฐ€๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ์ด์œ . ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ชจ๋“  ๊ณ„์‚ฐ์€ ์–ด๋–ป๊ฒŒ๋“  ๊ฐ•์ œ๋กœ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. "๋”๋Ÿฌ์šด" ๋ชจ๋‚˜๋“œ IO.

๋ชจ๋‚˜๋“œ๋Š” ๊ณ„์‚ฐ์„ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ํšจ๊ณผ ํ•˜์Šค์ผˆ์—์„œ. ์ž‘๋™ ๋ฐฉ์‹์„ ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ์€ ์ด ๊ฒŒ์‹œ๋ฌผ์˜ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚ฉ๋‹ˆ๋‹ค. ํ›Œ๋ฅญํ•˜๊ณ  ๋ช…ํ™•ํ•œ ์„ค๋ช…์„ ์˜์–ด๋กœ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—.

์—ฌ๊ธฐ์„œ๋Š” IO์™€ ๊ฐ™์€ ์ผ๋ถ€ ๋ชจ๋‚˜๋“œ๊ฐ€ ์ปดํŒŒ์ผ๋Ÿฌ ๋งˆ๋ฒ•์„ ํ†ตํ•ด ๊ตฌํ˜„๋˜๋Š” ๋ฐ˜๋ฉด, ๊ฑฐ์˜ ๋ชจ๋“  ๋ชจ๋‚˜๋“œ๋Š” ์†Œํ”„ํŠธ์›จ์–ด๋กœ ๊ตฌํ˜„๋˜๋ฉฐ ๊ทธ ์•ˆ์˜ ๋ชจ๋“  ๊ณ„์‚ฐ์€ ์ˆœ์ˆ˜ํ•˜๋‹ค๋Š” ์ ์„ ์ง€์ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋งŽ์€ ํšจ๊ณผ๊ฐ€ ์žˆ์œผ๋ฉฐ ๊ฐ๊ฐ ๊ณ ์œ ํ•œ ๋ชจ๋‚˜๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋งค์šฐ ๊ฐ•๋ ฅํ•˜๊ณ  ์•„๋ฆ„๋‹ค์šด ์ด๋ก ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ๋ชจ๋‚˜๋“œ๋Š” ๋™์ผํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ ์„ธ ๊ฐ€์ง€ ๋ชจ๋‚˜๋“œ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค:

  • ea๋Š” a ์œ ํ˜•์˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜ e ์œ ํ˜•์˜ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๊ณ„์‚ฐ์ž…๋‹ˆ๋‹ค. ์ด ๋ชจ๋‚˜๋“œ์˜ ๋™์ž‘์€ ๋ช…๋ นํ˜• ์–ธ์–ด์˜ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ์™€ ๋งค์šฐ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์˜ค๋ฅ˜๋ฅผ ํฌ์ฐฉํ•˜๊ฑฐ๋‚˜ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฃผ์š” ์ฐจ์ด์ ์€ ๋ชจ๋‚˜๋“œ๋Š” Haskell์˜ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์™„์ „ํžˆ ๋…ผ๋ฆฌ์ ์œผ๋กœ ๊ตฌํ˜„๋˜๋Š” ๋ฐ˜๋ฉด ๋ช…๋ นํ˜• ์–ธ์–ด๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์šด์˜ ์ฒด์ œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ์ƒํƒœ sa๋Š” a ์œ ํ˜•์˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  s ์œ ํ˜•์˜ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋Š” ๊ณ„์‚ฐ์ž…๋‹ˆ๋‹ค.
  • ์•„๋งˆ. Maybe ๋ชจ๋‚˜๋“œ๋Š” Nothing์„ ๋ฐ˜ํ™˜ํ•จ์œผ๋กœ์จ ์–ธ์ œ๋“ ์ง€ ์ค‘๋‹จ๋  ์ˆ˜ ์žˆ๋Š” ๊ณ„์‚ฐ์„ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” Maybe ์œ ํ˜•์— ๋Œ€ํ•œ MonadPlus ํด๋ž˜์Šค์˜ ๊ตฌํ˜„์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๋ฐ˜๋Œ€ ํšจ๊ณผ๋ฅผ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํŠน์ • ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•จ์œผ๋กœ์จ ์–ธ์ œ๋“ ์ง€ ์ค‘๋‹จ๋  ์ˆ˜ ์žˆ๋Š” ๊ณ„์‚ฐ์ž…๋‹ˆ๋‹ค.

์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌํ˜„

Graph a์™€ Bigraph ab๋ผ๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐ์ดํ„ฐ ์œ ํ˜•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ๋Š” a ์œ ํ˜•์˜ ๊ฐ’์œผ๋กœ ๋ ˆ์ด๋ธ”์ด ์ง€์ •๋œ ์ •์ ์ด ์žˆ๋Š” ๊ทธ๋ž˜ํ”„๋ฅผ ๋‚˜ํƒ€๋‚ด๊ณ , ๋‘ ๋ฒˆ์งธ๋Š” a ์œ ํ˜•๊ณผ ์˜ค๋ฅธ์ชฝ์˜ ๊ฐ’์œผ๋กœ ๋ ˆ์ด๋ธ”์ด ์ง€์ •๋œ ์™ผ์ชฝ ์ •์ ์ด ์žˆ๋Š” ์ด๋ถ„ ๊ทธ๋ž˜ํ”„๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. - b ์œ ํ˜•์˜ ๊ฐ’์œผ๋กœ ๋ ˆ์ด๋ธ”์ด ์ง€์ •๋œ ์ธก๋ฉด ์ •์ .

์ด๋Š” Alga ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์œ ํ˜•์ด ์•„๋‹™๋‹ˆ๋‹ค. Alga์—๋Š” ๋ฐฉํ–ฅ์ด ์—†๋Š” ์ด๋ถ„ ๊ทธ๋ž˜ํ”„์— ๋Œ€ํ•œ ํ‘œํ˜„์ด ์—†์Šต๋‹ˆ๋‹ค. ๋ช…ํ™•์„ฑ์„ ์œ„ํ•ด ์ด์™€ ๊ฐ™์€ ์œ ํ˜•์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ๋‹ค์Œ ์„œ๋ช…์ด ์žˆ๋Š” ๋„์šฐ๋ฏธ ํ•จ์ˆ˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

-- ะกะฟะธัะพะบ ัะพัะตะดะตะน ะดะฐะฝะฝะพะน ะฒะตั€ัˆะธะฝั‹.
neighbours :: Ord a => a -> Graph a -> [a]

-- ะŸะพัั‚ั€ะพะธั‚ัŒ ะดะฒัƒะดะพะปัŒะฝั‹ะน ะณั€ะฐั„ ะฟะพ ะณั€ะฐั„ัƒ ะธ ั„ัƒะฝะบั†ะธะธ, ะดะปั ะบะฐะถะดะพะน ะฒะตั€ัˆะธะฝั‹
-- ะฒั‹ะดะฐัŽั‰ะตะน ะตั‘ ะดะพะปัŽ ะธ ะฟะพะผะตั‚ะบัƒ ะฒ ะฝะพะฒะพะน ะดะพะปะต, ะธะณะฝะพั€ะธั€ัƒั ะบะพะฝั„ะปะธะบั‚ะฝั‹ะต ั€ั‘ะฑั€ะฐ.
toBipartiteWith :: (Ord a, Ord b, Ord c) => (a -> Either b c)
                                         -> Graph a
                                         -> Bigraph b c

-- ะกะฟะธัะพะบ ะฒะตั€ัˆะธะฝ ะฒ ะณั€ะฐั„ะต
vertexList :: Ord a => Graph a -> [a]
ะกะธะณะฝะฐั‚ัƒั€ะฐ ั„ัƒะฝะบั†ะธะธ, ะบะพั‚ะพั€ัƒัŽ ะผั‹ ะฑัƒะดะตะผ ะฟะธัะฐั‚ัŒ, ะฒั‹ะณะปัะดะธั‚ ั‚ะฐะบ:

type OddCycle a = [a]
detectParts :: Ord a => Graph a -> Either (OddCycle a) (Bigraph a a)

๊นŠ์ด ์šฐ์„  ๊ฒ€์ƒ‰ ์ค‘์— ์ถฉ๋Œํ•˜๋Š” ์—์ง€๋ฅผ ๋ฐœ๊ฒฌํ•˜๋ฉด ํ™€์ˆ˜ ์‚ฌ์ดํด์ด ์žฌ๊ท€ ์Šคํƒ ์ƒ๋‹จ์— ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์‰ฝ๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋ฅผ ๋ณต์›ํ•˜๋ ค๋ฉด ์žฌ๊ท€ ์Šคํƒ๋ถ€ํ„ฐ ๋งˆ์ง€๋ง‰ โ€‹โ€‹์ •์ ์˜ ์ฒซ ๋ฒˆ์งธ ๋ฐœ์ƒ๊นŒ์ง€ ๋ชจ๋“  ๊ฒƒ์„ ์ž˜๋ผ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ๊ฐ ์ •์ ์— ๋Œ€ํ•œ ๊ณต์œ  ๋ฒˆํ˜ธ์˜ ์—ฐ๊ด€ ๋ฐฐ์—ด์„ ์œ ์ง€ํ•จ์œผ๋กœ์จ ๊นŠ์ด ์šฐ์„  ๊ฒ€์ƒ‰์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ์žฌ๊ท€ ์Šคํƒ์€ ์šฐ๋ฆฌ๊ฐ€ ์„ ํƒํ•œ ๋ชจ๋‚˜๋“œ์˜ Functor ํด๋ž˜์Šค ๊ตฌํ˜„์„ ํ†ตํ•ด ์ž๋™์œผ๋กœ ์œ ์ง€ ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ๊ฒฝ๋กœ์˜ ๋ชจ๋“  ์ •์ ์„ ์žฌ๊ท€ ํ•จ์ˆ˜์—์„œ ๋ฐ˜ํ™˜๋œ ๊ฒฐ๊ณผ์— ๋„ฃ๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋‚˜์˜ ์ฒซ ๋ฒˆ์งธ ์•„์ด๋””์–ด๋Š” ์šฐ๋ฆฌ์—๊ฒŒ ํ•„์š”ํ•œ ํšจ๊ณผ๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ด๋Š” ์–‘์ชฝ ๋ชจ๋‚˜๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ์ž‘์„ฑํ•œ ์ฒซ ๋ฒˆ์งธ ๊ตฌํ˜„์€ ์ด ์˜ต์…˜์— ๋งค์šฐ ๊ฐ€๊น์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค, ์ €๋Š” ํ•œ ์ง€์ ์—์„œ ๋‹ค์„ฏ ๊ฐ€์ง€ ๋‹ค๋ฅธ ๊ตฌํ˜„์„ ์ˆ˜ํ–‰ํ–ˆ๊ณ  ๊ฒฐ๊ตญ ๋‹ค๋ฅธ ๊ตฌํ˜„์œผ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ฒซ์งธ, ๊ณต์œ  ์‹๋ณ„์ž์˜ ์—ฐ๊ด€ ๋ฐฐ์—ด์„ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” State์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‘˜์งธ, ์ถฉ๋Œ์ด ๊ฐ์ง€๋˜๋ฉด ์ค‘์ง€ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋‘˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ์œ„ํ•œ Monad์ผ ์ˆ˜๋„ ์žˆ๊ณ  Maybe๋ฅผ ์œ„ํ•œ MonadPlus์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฃผ์š” ์ฐจ์ด์ ์€ ๊ณ„์‚ฐ์ด ์ค‘์ง€๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋‘˜ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๊ณ  Maybe๋Š” ์ด ๊ฒฝ์šฐ ์ด์— ๋Œ€ํ•œ ์ •๋ณด๋งŒ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์„ฑ๊ณต์„ ์œ„ํ•ด ๋ณ„๋„์˜ ๊ฐ’์ด ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ(์ด๋ฏธ State์— ์ €์žฅ๋˜์–ด ์žˆ์Œ) Maybe๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‘ ๋ชจ๋‚˜๋“œ์˜ ํšจ๊ณผ๋ฅผ ๊ฒฐํ•ฉํ•ด์•ผ ํ•˜๋Š” ์ˆœ๊ฐ„, ๊ทธ๋“ค์€ ๋‚˜์˜ต๋‹ˆ๋‹ค. ๋ชจ๋‚˜๋“œ ๋ณ€์••๊ธฐ, ์ด๋Ÿฌํ•œ ํšจ๊ณผ๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ๊ฒฐํ•ฉํ•ฉ๋‹ˆ๋‹ค.

์™œ ์ด๋ ‡๊ฒŒ ๋ณต์žกํ•œ ์œ ํ˜•์„ ์„ ํƒํ–ˆ์Šต๋‹ˆ๊นŒ? ๋‘ ๊ฐ€์ง€ ์ด์œ . ์ฒซ์งธ, ๊ตฌํ˜„์€ ๋ช…๋ นํ˜•๊ณผ ๋งค์šฐ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‘˜์งธ, ํ™€์ˆ˜ ๋ฃจํ”„๋ฅผ ๋ณต์›ํ•˜๊ธฐ ์œ„ํ•ด ์žฌ๊ท€์—์„œ ๋Œ์•„์˜ฌ ๋•Œ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ ๋ฐ˜ํ™˜ ๊ฐ’์„ ์กฐ์ž‘ํ•ด์•ผ ํ•˜๋Š”๋ฐ, ์ด๋Š” Maybe ๋ชจ๋‚˜๋“œ์—์„œ ํ›จ์”ฌ ์‰ฝ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” ์ด๋Ÿฌํ•œ ๊ตฌํ˜„์„ ์–ป์Šต๋‹ˆ๋‹ค.

{-# LANGUAGE ExplicitForAll #-}
{-# LANGUAGE ScopedTypeVariables #-}

data Part = LeftPart | RightPart

otherPart :: Part -> Part
otherPart LeftPart  = RightPart
otherPart RightPart = LeftPart

type PartMap a = Map.Map a Part
type OddCycle a = [a]

toEither :: Ord a => PartMap a -> a -> Either a a
toEither m v = case fromJust (v `Map.lookup` m) of
                    LeftPart  -> Left  v
                    RightPart -> Right v

type PartMonad a = MaybeT (State (PartMap a)) [a]

detectParts :: forall a. Ord a => Graph a -> Either (OddCycle a) (Bigraph a a)
detectParts g = case runState (runMaybeT dfs) Map.empty of
                     (Just c, _)  -> Left  $ oddCycle c
                     (Nothing, m) -> Right $ toBipartiteWith (toEither m) g
    where
        inVertex :: Part -> a -> PartMonad a
        inVertex p v = ((:) v) <$> do modify $ Map.insert v p
                                      let q = otherPart p
                                      msum [ onEdge q u | u <- neigbours v g ]

        {-# INLINE onEdge #-}
        onEdge :: Part -> a -> PartMonad a
        onEdge p v = do m <- get
                        case v `Map.lookup` m of
                             Nothing -> inVertex p v
                             Just q  -> do guard (q /= p)
                                           return [v]

        processVertex :: a -> PartMonad a
        processVertex v = do m <- get
                             guard (v `Map.notMember` m)
                             inVertex LeftPart v

        dfs :: PartMonad a
        dfs = msum [ processVertex v | v <- vertexList g ]

        oddCycle :: [a] -> [a]
        oddCycle c = tail (dropWhile ((/=) last c) c)

where ๋ธ”๋ก์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ ์•ˆ์—์„œ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ์„ค๋ช…ํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • inVertex๋Š” ์ฒ˜์Œ์œผ๋กœ ์ •์ ์„ ๋ฐฉ๋ฌธํ•˜๋Š” ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ์ •์ ์— ๊ณต์œ  ๋ฒˆํ˜ธ๋ฅผ ํ• ๋‹นํ•˜๊ณ  ๋ชจ๋“  ์ด์›ƒ์—์„œ onEdge๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋˜ํ•œ ํ˜ธ์ถœ ์Šคํƒ์„ ๋ณต์›ํ•˜๋Š” ๊ณณ์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. msum์ด ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋ฉด ์ •์  v๋ฅผ ๊ฑฐ๊ธฐ์— ํ‘ธ์‹œํ•ฉ๋‹ˆ๋‹ค.
  • onEdge๋Š” ์šฐ๋ฆฌ๊ฐ€ ์—ฃ์ง€๋ฅผ ๋ฐฉ๋ฌธํ•˜๋Š” ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. ๊ฐ ๊ฐ€์žฅ์ž๋ฆฌ์— ๋Œ€ํ•ด ๋‘ ๋ฒˆ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ๋ฐ˜๋Œ€ํŽธ ์ •์ ์„ ๋ฐฉ๋ฌธํ–ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋ฐฉ๋ฌธํ•ฉ๋‹ˆ๋‹ค. ๋ฐฉ๋ฌธํ•˜๋ฉด ๊ฐ€์žฅ์ž๋ฆฌ๊ฐ€ ์ถฉ๋Œํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๊ทธ๋ ‡๋‹ค๋ฉด, ์šฐ๋ฆฌ๋Š” ์žฌ๊ท€ ์Šคํƒ์˜ ๋งจ ์œ„ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ, ๋ฐ˜ํ™˜ ์‹œ ๋‹ค๋ฅธ ๋ชจ๋“  ์ •์ ์ด ๋ฐฐ์น˜๋ฉ๋‹ˆ๋‹ค.
  • processVertex๋Š” ๊ฐ ๊ผญ์ง€์ ์„ ๋ฐฉ๋ฌธํ–ˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๊ณ  ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ inVertex๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • dfs๋Š” ๋ชจ๋“  ์ •์ ์—์„œ processVertex๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒŒ ๋‹ค์•ผ.

INLINE์ด๋ผ๋Š” ๋‹จ์–ด์˜ ์—ญ์‚ฌ

INLINE์ด๋ผ๋Š” ๋‹จ์–ด๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ฒซ ๋ฒˆ์งธ ๊ตฌํ˜„์—๋Š” ์—†์—ˆ์ง€๋งŒ ๋‚˜์ค‘์— ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ๋” ๋‚˜์€ ๊ตฌํ˜„์„ ์ฐพ์œผ๋ ค๊ณ  ๋…ธ๋ ฅํ–ˆ์„ ๋•Œ INLINE์ด ์•„๋‹Œ ๋ฒ„์ „์ด ์ผ๋ถ€ ๊ทธ๋ž˜ํ”„์—์„œ ๋ˆˆ์— ๋„๊ฒŒ ๋Š๋ ค์ง€๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋Šฅ์ด ์˜๋ฏธ์ƒ ๋™์ผํ•˜๊ฒŒ ์ž‘๋™ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์„ ๊ณ ๋ คํ•˜๋ฉด ์ด๋Š” ๋งค์šฐ ๋†€๋ž์Šต๋‹ˆ๋‹ค. ๋” ์ด์ƒํ•˜๊ฒŒ๋„, ๋‹ค๋ฅธ ๋ฒ„์ „์˜ GHC๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค๋ฅธ ์ปดํ“จํ„ฐ์—์„œ๋Š” ๋ˆˆ์— ๋„๋Š” ์ฐจ์ด๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

์ผ์ฃผ์ผ ๋™์•ˆ GHC Core ์ถœ๋ ฅ์„ ์ฝ์€ ํ›„ ๋ช…์‹œ์ ์ธ INLINE ํ•œ ์ค„๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. GHC 8.4.4์™€ GHC 8.6.5 ์‚ฌ์ด์˜ ์–ด๋Š ์‹œ์ ์—์„œ ์ตœ์ ํ™” ํ”„๋กœ๊ทธ๋žจ์€ ์ด ์ž‘์—…์„ ์ž์ฒด์ ์œผ๋กœ ์ค‘๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” Haskell ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ๊ทธ๋Ÿฐ ๋จผ์ง€๋ฅผ ๋งŒ๋‚  ๊ฒƒ์ด๋ผ๊ณ ๋Š” ์˜ˆ์ƒํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์˜ค๋Š˜๋‚ ์—๋„ ์˜ตํ‹ฐ๋งˆ์ด์ €๋Š” ๋•Œ๋•Œ๋กœ ์‹ค์ˆ˜๋ฅผ ํ•˜๋ฉฐ, ๊ทธ๋“ค์—๊ฒŒ ํžŒํŠธ๋ฅผ ์ฃผ๋Š” ๊ฒƒ์ด ์šฐ๋ฆฌ์˜ ์ž„๋ฌด์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๋Š” ํ•จ์ˆ˜๊ฐ€ ๋ช…๋ นํ˜• ๋ฒ„์ „์—์„œ ์ธ๋ผ์ธ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ธ๋ผ์ธ๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์œผ๋ฉฐ ์ด๊ฒƒ์ด ์ปดํŒŒ์ผ๋Ÿฌ์— ํžŒํŠธ๋ฅผ ์ œ๊ณตํ•˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ์— ๋ฌด์Šจ ์ผ์ด ์žˆ์—ˆ๋˜๊ฑฐ์•ผ?

๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‹ค๋ฅธ ๋ชจ๋‚˜๋“œ์™€ ํ•จ๊ป˜ Hopcroft-Karp ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ–ˆ๊ณ , ๊ทธ๊ฒƒ์ด ํ”„๋กœ๊ทธ๋žจ์˜ ๋์ด์—ˆ์Šต๋‹ˆ๋‹ค.

Google Summer of Code ๋•๋ถ„์— ์ €๋Š” ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๋Œ€ํ•œ ์‹ค๋ฌด ๊ฒฝํ—˜์„ ์–ป์—ˆ๊ณ , ์ด๋Š” ๋‹ค์Œ ์—ฌ๋ฆ„์— Jane Street์—์„œ ์ธํ„ด์‹ญ์„ ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜์—ˆ์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ(Habr์˜ ์ง€์‹์ด ํ’๋ถ€ํ•œ ์ฒญ์ค‘๋“ค ์‚ฌ์ด์—์„œ๋„ ์ด ๊ณณ์ด ์–ผ๋งˆ๋‚˜ ์ž˜ ์•Œ๋ ค์ ธ ์žˆ๋Š”์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ, ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ์ฐธ์—ฌํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๋ฆ„์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋Š” ์†Œ์ˆ˜์˜ ๊ณณ ์ค‘) ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ „ํ†ต์ ์ธ ์–ธ์–ด์—์„œ์˜ ๊ฒฝํ—˜๊ณผ๋Š” ์ƒ๋‹นํžˆ ๋‹ค๋ฅธ ์ด ํŒจ๋Ÿฌ๋‹ค์ž„์„ ์‹ค์ œ๋กœ ์ ์šฉํ•˜๋Š” ๋ฉ‹์ง„ ์„ธ๊ณ„๋ฅผ ์†Œ๊ฐœํ–ˆ์Šต๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€