> [!date] published: 2022-03-18 ## ๐Ÿš€ intro ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋Œ€ํ•ด์„œ ๊ณต๋ถ€ํ•˜๋Š” ๊ณผ์ œ์ด๋‹ค. ์Šคํƒ์„ ๊ตฌํ˜„ํ•˜๊ณ , ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•˜๊ณ , ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ์— ๋Œ€ํ•ด์„œ ๊ณต๋ถ€ํ•  ์ˆ˜ ์žˆ๋Š” ๊ณผ์ œ์˜€๋‹ค. ## ๐Ÿš€ ํ•ด๊ฒฐ ์ˆœ์„œ ์•ž์„œ์„œ ํ–ˆ๋˜ ๊ณผ์ œ๋“ค์€ ์‚ฌ์‹ค ํ•ด์•ผ ํ•  ์ผ์ด ๋ช…ํ™•ํžˆ ์ •ํ•ด์ ธ ์žˆ์–ด์„œ ๊ทธ๋ƒฅ ๋งˆ์Œ๊ฐ€๋Š”๋Œ€๋กœ (?) ํ•˜๋‚˜์”ฉ ํ•ด๊ฒฐํ•ด๊ฐ€๋ฉด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ „์ฒด์ ์œผ๋กœ ๊ณผ์ œ๊ฐ€ ํ•ด๊ฒฐ์ด ๋˜์—ˆ์—ˆ๋Š”๋ฐ push_swap์€ ํ•ด์•ผ ํ•  ์ผ์ด ๋„ˆ๋ฌด ๋งŽ์•„์„œ ๊ทธ๋ƒฅ ๋ฌดํ„ฑ๋Œ€๊ณ  ์‹œ์ž‘์„ ํ•˜๋‹ˆ๊นŒ ์ด๊ฒƒ๋„ ํ•„์š”ํ•˜๊ณ , ์ €๊ฒƒ๋„ ํ•„์š”ํ•œ ์ƒํ™ฉ์ด ๋งŽ์•„์ง€๋ฉด์„œ ๋„ˆ๋ฌด ํ˜ผ๋ž€์Šค๋Ÿฌ์› ๋‹ค. ๊ทธ๋ž˜์„œ ์ด๋ฒˆ ๊ณผ์ œ๋ฅผ ํ•˜๋ฉด์„œ๋Š” ์–ด๋–ค ์ˆœ์„œ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด ๋‚˜๊ฐˆ์ง€ ๊ณ„ํš์„ ์„ธ์šฐ๊ณ , ๊ทธ ์ˆœ์„œ๋Œ€๋กœ ๊ณผ์ œ๋ฅผ ์ฐจ๊ทผ์ฐจ๊ทผ ์ง„ํ–‰ํ•ด ๋‚˜๊ฐ”๋‹ค. 1. ์„œ๋ธŒ์ ํŠธ ์ดํ•ดํ•˜๊ธฐ 2. STACK ๊ตฌํ˜„ํ•˜๊ธฐ - ์ž๋ฃŒ๊ตฌ์กฐ ๊ตฌํ˜„, `push`, `pop` ํ•จ์ˆ˜ ๊ตฌํ˜„ 3. ์„œ๋ธŒ์ ํŠธ์˜ ๋ช…๋ น์–ด ๊ตฌํ˜„ํ•˜๊ธฐ - `sa`, `sb`, `ss`, `pa`, `pb`, `ra`, `rb`, `rr`, `rra`, `rrb`, `rrr` 4. ์ธ์ž ์ „์ฒ˜๋ฆฌ ๊ตฌํ˜„ํ•˜๊ธฐ - ์ •์ˆ˜ ๋ณ€ํ™˜, ์˜ค๋ฅ˜ ์ž…๋ ฅ ์ฒ˜๋ฆฌ 5. sort ๊ตฌํ˜„ํ•˜๊ธฐ ์ด๋ ‡๊ฒŒ ์ผ์ฃผ์ผ ์ •๋„ ์•ˆ์— ํ•ด๊ฒฐ์„ ํ•ด์•ผ๊ฒ ๋‹ค ๊ณ„ํš์„ ์„ธ์šฐ๊ธด ํ–ˆ๋Š”๋ฐ ์ค‘๊ฐ„์— sort ์•Œ๊ณ ๋ฆฌ์ฆ˜๋„ ๋ฐ”๊พธ๊ณ , ํ•˜๋ฃจ์— ํ•˜๋‚˜์”ฉ ํ•˜๊ธฐ๋Š” ์ข€ ๋ฌด๋ฆฌ์˜€๊ณ , ์ข€ ๋ฐ๊ธฐ์  ๊ฑฐ๋ฆฌ๊ธฐ๋„ ํ–ˆ๊ณ  (์ ๋‹ค๋ณด๋‹ˆ๊นŒ ๋ณ€๋ช…๊ฐ™์€๋ฐ ํ•  ๋ง์€ ์—†๋‹ค;;) ๊ทธ๋ž˜์„œ ์ด 2์ฃผ ์ •๋„ ๊ฑธ๋ฆฐ ๊ฒƒ ๊ฐ™๋‹ค. ## ๐Ÿš€ 1. ์„œ๋ธŒ์ ํŠธ ์ดํ•ดํ•˜๊ธฐ ์Šคํƒ 2๊ฐœ๋ฅผ ๊ฐ€์ง€๊ณ  ์›์†Œ๋“ค์„ ์ด๋ฆฌ์ €๋ฆฌ ์˜ฎ๊ฒจ๊ฐ€๋ฉด์„œ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌํ•˜๋Š” ๊ณผ์ œ์ด๋‹ค. ์›์†Œ๋“ค์„ ์˜ฎ๊ธธ ๋•Œ ์„œ๋ธŒ์ ํŠธ์—์„œ ์ •์˜ํ•ด ์ค€ ๋ช…๋ น์–ด๋“ค์„ ์‚ฌ์šฉํ•ด์„œ ์˜ฎ๊ฒจ์ค˜์•ผ ํ•˜๊ณ , ๊ทธ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ช…๋ น์–ด์˜ ๊ฐœ์ˆ˜๋ฅผ ์ตœ์†Œ๋กœ ํ•˜๋Š” ๊ทธ ๋ชฉ๋ก์„ ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ์ด ์ด ๊ณผ์ œ์˜ ์ตœ์ข… ๋ชฉํ‘œ์ด๋‹ค. ## ๐Ÿš€ 2. STACK ๊ตฌํ˜„ํ•˜๊ธฐ ์„œ๋ธŒ์ ํŠธ์—์„œ๋Š” ์Šคํƒ์ด๋ผ๊ณ  ๋งํ•˜๊ธด ํ–ˆ์ง€๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ช…๋ น์–ด๋ฅผ ๋ณด๋ฉด ์Šคํƒ๋ณด๋‹ค๋Š” ์ˆœํ™˜ ํ์— ๋” ๊ฐ€๊น๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ ๋‹ค. ๊ทธ๋ž˜๋„ ์„œ๋ธŒ์ ํŠธ์—์„œ ์Šคํƒ์ด๋ผ๊ณ  ํ–ˆ์œผ๋‹ˆ ์Šคํƒ์„ ๊ตฌํ˜„ํ•˜๊ณ , ์Šคํƒ์—์„œ ์‚ฌ์šฉํ•  `push`์™€ `pop` ๋ช…๋ น์–ด๋ฅผ ๊ตฌํ˜„ํ•ด์คฌ๋‹ค. ์Šคํƒ์€ ์›ํ˜• ์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋กœ ๊ตฌํ˜„ํ•ด์คฌ๋‹ค. ๋‚˜๋Š” rotate ์—ฐ์‚ฐ์„ ๋ณด๋‹ค ์‰ฝ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ, ๊ทธ๋ฆฌ๊ณ  ํƒ์ƒ‰์„ ๋ณด๋‹ค ์‰ฝ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์›ํ˜•, ๊ทธ๋ฆฌ๊ณ  ์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋กœ ๊ตฌํ˜„์„ ํ•œ๊ฑด๋ฐ ๊ตณ์ด ์›ํ˜• ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋กœ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๊ณ  ์Šคํƒ์˜ ์ •๋ณด๋ฅผ ์ €์žฅํ•  ๊ตฌ์กฐ์ฒด์— top๊ณผ bottom ์„ ๋ชจ๋‘ ์ €์žฅํ•˜๊ฒŒ ํ•ด์„œ ์‹œ์ž‘๊ณผ ๋์„ ์กฐ์ •ํ•ด๊ฐ€๋ฉด์„œ rotate ์—ฐ์‚ฐ์„ ๊ตฌํ˜„ํ•˜์‹  ๋ถ„๋„ ๊ณ„์‹  ๋“ฏ ํ•˜๋‹ค. ์ด๊ฑฐ๋Š” ์–ด๋–ค ์ชฝ์ด ํŽธํ•˜๋ƒ์— ๋”ฐ๋ผ ์„ ํƒํ•˜๋ฉด ๋  ๋“ฏ ํ•˜๋‹ค! ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ ๊ตฌํ˜„์„ ๋‹ค ํ–ˆ์œผ๋ฉด ์ด์ œ push ์™€ pop ๊ตฌํ˜„ํ•˜๊ธฐ... ์‚ฌ์‹ค ์›ํ˜• ์ด์ค‘ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋กœ ์Šคํƒ์„ ๊ตฌํ˜„ํ•˜๊ฒŒ ๋˜๋ฉด push์™€ pop๊ตฌํ˜„์ด ์ข€ ๊ณจ์น˜์•„ํŒŒ์ง„๋‹ค. ์•„๋ฌดํŠผ ![[27bcab83-e27e-4e67-b993-0bd27cddc91e.png]] ์Šคํƒ์€ ์œ„ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์€ ๊ตฌ์กฐ๋กœ ๊ตฌํ˜„ํ–ˆ๊ณ  ![[3876bbb7-5047-4a3c-83e8-35b86fc6deba.png]] ๊ฐ„๋‹จํ•œ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ ์ž˜ ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ## ๐Ÿš€ 3. ์„œ๋ธŒ์ ํŠธ์˜ ๋ช…๋ น์–ด ๊ตฌํ˜„ํ•˜๊ธฐ ### โœจ `sa`, `sb`, `ss` ๊ฐ stack์˜ top์— ์žˆ๋Š” 2๊ฐœ์˜ ์š”์†Œ๋ฅผ swap ๊ตณ์ด pop๊ณผ push๋ฅผ ํ•ด ์ค„ ํ•„์š” ์—†์ด ๊ทธ๋ƒฅ value๋งŒ swapํ•ด์ฃผ๋ฉด ๋œ๋‹ค. ### โœจ `pa`, `pb` ๊ฐ ์Šคํƒ์˜ top์„ ๋‹ค๋ฅธ ์Šคํƒ์— pushํ•˜๊ณ , ํ˜„์žฌ stack์—์„œ๋Š” popํ•˜๊ธฐ ### โœจ `ra`, `rb`, `rr`, `rra`, `rrb`, `rrr` top์„ ์ƒํ™ฉ์— ๋งž๊ฒŒ ๋ฐ”๊พธ์–ด์ฃผ๋ฉด ๋œ๋‹ค. ## ๐Ÿš€ 4. ์ธ์ž ์ „์ฒ˜๋ฆฌ ๊ตฌํ˜„ํ•˜๊ธฐ ์„œ๋ธŒ์ ํŠธ์—์„œ ์˜ค๋ฅ˜ ์ž…๋ ฅ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ์š”๊ตฌํ•˜๊ธด ํ–ˆ๋Š”๋ฐ ๊ทธ ๊ธฐ์ค€์ด ๊ต‰์žฅํžˆ ๋ชจํ˜ธํ•ด์„œ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋Š” ์ž…๋ ฅ์— ๋Œ€ํ•ด์„œ๋Š” ๋ชจ๋“  ์ฒ˜๋ฆฌ๋ฅผ ํ•ด ์คฌ์–ด์•ผ ํ–ˆ๋‹ค. (๋ง‰์ƒ ํ‰๊ฐ€ํ‘œ์—์„œ๋Š” ๊ทธ๋ ‡๊ฒŒ ๋นก๋นกํ•˜๊ฒŒ ๊ฒ€ํ† ํ•˜์ง„ ์•Š์•˜์ง€๋งŒ ํ‰๊ฐ€์ž์— ๋”ฐ๋ผ์„œ๋Š” ๋‹ค์–‘ํ•œ ์ผ€์ด์Šค๋ฅผ ๊ฒ€ํ† ํ• ์ˆ˜๋„ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹คใ…Žใ…Ž) ๋‚ด๊ฐ€ ์ฒ˜๋ฆฌํ•ด์ค€ ์˜ˆ์™ธ ์ž…๋ ฅ๋“ค์€ - ์ธ์ž๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ => ์•„๋ฌด๊ฒƒ๋„ ์ถœ๋ ฅํ•˜์ง€ ์•Š๋Š”๋‹ค. (error๊ฐ€ ์•„๋‹ˆ๋‹ค!) - ์ธ์ž์— ์ˆซ์ž๊ฐ€ ์•„๋‹Œ ๋ฌธ์ž๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ => error - ๋ถ€ํ˜ธ๋งŒ ์žˆ๋Š” ๊ฒฝ์šฐ => error - 1๊ฐœ์˜ ์ธ์ž์— ๊ณต๋ฐฑ์„ ๊ธฐ์ค€์œผ๋กœ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ •์ˆ˜๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ => ๊ณต๋ฐฑ์„ ๊ธฐ์ค€์œผ๋กœ ํŒŒ์‹ฑํ•ด์ค˜์•ผ ํ•œ๋‹ค. - ์ •์ˆ˜ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋Š” ๊ฒฝ์šฐ => error - ์ค‘๋ณต๋œ ์ธ์ง€๊ฐ€ ์ž…๋ ฅ๋œ ๊ฒฝ์šฐ => error ๊ฐ€ ์žˆ๋‹ค. ๋‹ค๋ฅธ ์˜ˆ์™ธ ์ผ€์ด์Šค๋“ค์€ ์ฒ˜๋ฆฌํ•˜๋Š”๊ฒŒ ๊ทธ๋ ‡๊ฒŒ ์–ด๋ ต์ง€๋Š” ์•Š์•˜๋Š”๋ฐ 4๋ฒˆ์งธ ์˜ˆ์™ธ์ธ ๊ณต๋ฐฑ์„ ๊ธฐ์ค€์œผ๋กœ ํŒŒ์‹ฑํ•˜๋Š” ๋ถ€๋ถ„์ด ์ข€ ์–ด๋ ต๊ธด ํ–ˆ๋‹ค. ๋งŽ์ด ์“ฐ์‹œ๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ๊ธฐ์กด libft์—์„œ ๋งŒ๋“ค์–ด๋’€๋˜ `ft_split`์„ ์‚ฌ์šฉํ•˜์‹œ๋Š” ๊ฒƒ ๊ฐ™์•˜๋Š”๋ฐ ๋‚˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๊ฐ€ ์ข€ ์–ด๋ ค์šธ ๊ฒƒ ๊ฐ™์•„์„œ ๊ทธ๋ƒฅ ๋ฐ”๋กœ๋ฐ”๋กœ stack์— pushํ•ด์ฃผ๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ–ˆ๋‹ค. ๋งˆ์ง€๋ง‰ ์˜ˆ์™ธ ์ผ€์ด์Šค์ธ ์ค‘๋ณต์ธ์ž์˜ ๊ฒฝ์šฐ์—๋Š” ์ค‘๊ฐ„๊ฐ’์œผ๋กœ ํ”ผ๋ด‡์„ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ฏธ๋ฆฌ ์ž…๋ ฅ๋ฐ›์€ ์ธ์ž๋“ค์„ ์ •๋ ฌํ•ด๋’€๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ ์ •๋ ฌ๋œ ๋ฐฐ์—ด์—์„œ ์ธ์ ‘ํ•œ 2๊ฐœ์˜ ์›์†Œ๋“ค์„ ๋น„๊ตํ•˜๋ฉด์„œ ์ค‘๋ณต๋œ ๊ฒƒ์ด ์žˆ๋Š”์ง€ ํŒ๋‹จํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ์ค‘๋ณต ์ธ์ž ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ด์ฃผ์—ˆ๋‹ค. ## ๐Ÿš€ 5. sort ๊ตฌํ˜„ํ•˜๊ธฐ ### โœจ ์„œ๋ก  ์ข‹์€ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ƒ๊ฐํ•ด๋ณด๋ ค ํ–ˆ์œผ๋‚˜ ์‰ฝ์ง€ ์•Š์•˜๋‹ค. ๊ทธ๋ž˜์„œ ์ด๋Ÿฐ์ €๋Ÿฐ ๊ฐ€์ด๋“œ๋“ค์„ ๋งŽ์ด ์ฐพ์•„๋ดค๋Š”๋ฐ ๋Œ€๋ถ€๋ถ„ quick sort, ์•„๋‹ˆ๋ฉด merge sort๋ฅผ ์ด์šฉํ•œ ๊ฐ€์ด๋“œ๋“ค์ด ๋งŽ์•˜๋‹ค. ๊ทธ๋ž˜์„œ ๋‚˜๋„ ๋Œ€์„ธ๋ฅผ ๋”ฐ๋ผ quick sort๋กœ ๊ตฌํ˜„์„ ํ•˜๊ณ , 2~5๊ฐœ ์ •๋ ฌ๊นŒ์ง€ ๋ชจ๋‘ ๊ตฌํ˜„ํ•˜๊ณ , ๋ช…๋ น์–ด ์ตœ์ ํ™”๊นŒ์ง€ ๊ฐ”๋Š”๋ฐ... ๊ฐ‘์ž๊ธฐ ํ˜„ํƒ€๊ฐ€ ์™”๋‹ค. ![[44b752d2-89af-439b-bdab-946ba81a4d0f.png]] ํ˜„ํƒ€์˜จ๋‚ ์˜ ์ผ์ผ ๊ธฐ๋ก... ๋ฏธ๋ฆฌ ์ €์žฅํ•ด๋‘” ๋ช…๋ น์–ด๋ฅผ ์ตœ์ ํ™”ํ•˜๋Š” ๋ถ€๋ถ„์—์„œ ์—„์ฒญ ์ง€์ณค๋˜ ๊ฒƒ ๊ฐ™๋‹ค. ์–ด์ฐจํ”ผ ์‹ค์งˆ์ ์ธ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ณ ๋ คํ•ด์•ผ ํ•˜๋Š” ๊ณผ์ œ๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— (์ด ์ƒ๊ฐ์€ ๋™๋ฃŒํ‰๊ฐ€ ๋•Œ ๋ฐ˜๋ฐ•๋‹นํ•˜๊ธด ํ–ˆ๋‹ค..ใ…Žใ…Ž) ๊ตณ์ด ๋””๋ฒ„๊น…๋„ ์–ด๋ ค์šด quick sort๋ฅผ ์ด์šฉํ•ด์„œ ์ •๋ ฌ์„ ํ•ด์•ผ ํ•˜๋Š”์ง€, ๊ทธ๋งˆ์ €๋„ ์ตœ์„ ์˜ ์ •๋ ฌ ๋ฐฉ๋ฒ•์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ดํ›„์— ๋ช…๋ น์–ด ์ตœ์ ํ™”๋ฅผ ํ•ด ์ค˜์•ผ ํ•˜๋Š”๋ฐ? ์ด๋Ÿฐ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ƒ๊ฐ ๋•Œ๋ฌธ์— ๋‹ค์‹œ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์—†๋‚˜ ์—ด์‹ฌํžˆ ์ฐพ์•„๋ดค๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฐœ๊ฒฌํ•œ greedy algorithm์„ ์‚ฌ์šฉํ•œ push_swap ๊ฐ€์ด๋“œ.... [\[42 ์„œ์šธ\] push_swap์„ ์ผ€์ดํฌ์ฒ˜๋Ÿผ ์‰ฝ๊ฒŒ ๋จน๋Š” ๋ฒ• - 2](https://techdebt.tistory.com/27) ๊ฐ€์ด๋“œ๋ฅผ ๋„ˆ๋ฌด ์ž˜ ์จ์ฃผ์‹  ๋•๋ถ„์— ์ดํ•ด๋„ ๋„ˆ๋ฌด ์ž˜ ๋˜์—ˆ๊ณ , ๊ตฌํ˜„๊ณผ ๋””๋ฒ„๊น… ๊ณผ์ •๋„ quick sort์— ๋น„ํ•ด์„œ๋Š” ๋” ์‰ฝ๋‹ค๊ณ  ํŒ๋‹จ์„ ํ–ˆ๊ณ , ํ•ญ์ƒ ์ตœ์„ ์˜ ์„ ํƒ์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋งŒ์ ๋„ ๋„‰๋„‰ํ•˜๊ฒŒ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‚˜๋„ ์œ„์˜ ๊ฐ€์ด๋“œ๋ฅผ ์ฐธ๊ณ ํ•ด์„œ, ์ด๋ฏธ ์ •๋ ฌ๋œ stack์„ ํšŒ์ „์‹œ์ผœ๊ฐ€๋ฉด์„œ ์›์†Œ๋ฅผ ์‚ฝ์ž…ํ•˜๊ธฐ ์œ„ํ•œ ์ตœ์„ ์˜ ์„ ํƒ์„ ํ•˜๋Š” greedy algorithm์œผ๋กœ ์ •๋ ฌ ๊ตฌํ˜„์„ ํ•ด ์คฌ๋‹ค. ### โœจ ๊ตฌํ˜„ํ•˜๊ธฐ [42Cursus/push_swap at main ยท yoouyeon/42Cursus ยท GitHub](https://github.com/yoouyeon/42Cursus/tree/main/push_swap) ์ „๋ฐ˜์ ์ธ push_swap์˜ ๋™์ž‘์„ ํ•ด ์ฃผ๋Š” ํ•จ์ˆ˜๋Š” `ft_push_swap` ํ•จ์ˆ˜์ด๋‹ค. ```c void ft_push_swap(t_varlist *varlist) { if (is_sorted_a(varlist)) return ; if (varlist -> a -> size <= 5) { sort_a_less_five(varlist); return ; } divide_two(varlist); while (varlist -> a -> size > 3) pb(varlist -> a, varlist -> b); if (varlist -> a -> size == 2) sort_two_a(varlist); else sort_three_a(varlist); while (varlist -> b -> size > 0) rotate_and_pa(varlist); rotate_last(varlist); return ; } ``` ์ด ํ•จ์ˆ˜์—์„œ๋Š” ํ”ผ๋ด‡ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋จผ์ € a ์Šคํƒ์˜ ์›์†Œ๋“ค ์ค‘์—์„œ ๋น„๊ต์  ์ž‘์€ ์›์†Œ๋“ค์„ b ์Šคํƒ์œผ๋กœ ๋ณด๋‚ธ ๋’ค์—, (`divide_two` ํ•จ์ˆ˜) a ์Šคํƒ์„ ์ •๋ ฌํ•ด์ฃผ๊ณ , b ์Šคํƒ์˜ ๋ชจ๋“  ์›์†Œ๋“ค์„ a ์Šคํƒ์œผ๋กœ ๋ณด๋‚ผ ๋•Œ๊นŒ์ง€ ์ตœ์ ์˜ ๋ช…๋ น์–ด ๊ฐœ์ˆ˜๋กœ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋Š” b์˜ ์›์†Œ๋ฅผ ์ฐพ์•„์„œ `pa` ํ•ด ์ฃผ๋Š” ํ•จ์ˆ˜(`rotate_and_pa`)๋ฅผ ํ˜ธ์ถœํ•ด์ค€๋‹ค. ๋‹ค์Œ์€ b์˜ ์›์†Œ์˜ ๊ฐœ์ˆ˜๋งŒํผ ํ˜ธ์ถœ์ด ๋˜๋Š” `rotate_and_pa` ํ•จ์ˆ˜์ธ๋ฐ, ```c void rotate_and_pa(t_varlist *varlist) { int cnt_ra; int cnt_rb; cnt_ra = 0; cnt_rb = 0; get_ro_cnt(varlist, &cnt_ra, &cnt_rb); rotate_stack_a_b(varlist, &cnt_ra, &cnt_rb); rotate_stack_a(varlist, &cnt_ra); rotate_stack_b(varlist, &cnt_rb); pa(varlist -> a, varlist -> b); } ``` `get_ro_cnt` ํ•จ์ˆ˜์—์„œ ์ตœ์†Œ ๋ช…๋ น์–ด๋กœ b -> a ๋กœ ์˜ฎ๊ธธ ์ˆ˜ ์žˆ๋Š” ๊ทธ ์ตœ์ ์˜ ์›์†Œ๋ฅผ ๊ฐ ์Šคํƒ์˜ top์œผ๋กœ ์œ„์น˜์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” `ra` ํšŸ์ˆ˜์™€ `rb` ํšŸ์ˆ˜๋ฅผ ๊ตฌํ•ด ์ค€ ๋‹ค์Œ์— ๋™์ผํ•œ ๋ฐฉํ–ฅ์œผ๋กœ ๋Œ๋ฆด ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ฐ™์ด ๋Œ๋ ค์ฃผ๋Š” ํŽธ์ด ๋” ํšจ์œจ์ ์ด๋ฏ€๋กœ (`rr`, `rrr`) ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ๊ฐ™์€ ๋ฐฉํ–ฅ์œผ๋กœ ๋Œ๋ฆด ์ˆ˜ ์žˆ์„ ๋•Œ๊นŒ์ง€ ๊ฐ™์ด ๋Œ๋ ค์ฃผ๊ณ  (`rotate_stack_a_b`) ๊ทธ๋‹ค์Œ์— ๋‚จ์€ ํšŸ์ˆ˜๋งŒํผ a์Šคํƒ๊ณผ b ์Šคํƒ์„ ๋Œ๋ ค์ฃผ๊ฒŒ ๋˜๋ฉด (`rotate_stack_a`, `rotate_stack_b`) `pa`๋ฅผ ํ–ˆ์„ ๋•Œ b์˜ ์›ํ•˜๋Š” ์›์†Œ๋ฅผ a์˜ ์›ํ•˜๋Š” ์œ„์น˜์— ๋„ฃ์„ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ```c void get_ro_cnt(t_varlist *varlist, int *cnt_ra, int *cnt_rb) { t_node *temp; int b_idx; int new_cnt_ra; int new_cnt_rb; temp = varlist -> b -> top; b_idx = 0; while (b_idx < varlist -> b -> size) { new_cnt_ra = get_cnt_ra(varlist, temp -> value); if (b_idx > varlist -> b -> size / 2) new_cnt_rb = (varlist -> b -> size - b_idx) * -1; else new_cnt_rb = b_idx; if (b_idx == 0 || is_new_best_way(*cnt_ra, *cnt_rb, new_cnt_ra, new_cnt_rb) == 1) { *cnt_ra = new_cnt_ra; *cnt_rb = new_cnt_rb; } temp = temp -> next; b_idx++; } } ``` `get_ro_cnt` ํ•จ์ˆ˜์—์„œ๋Š” b์˜ ๋ชจ๋“  ์›์†Œ๋“ค์„ ํƒ์ƒ‰ํ•˜๋ฉด์„œ ํ˜„์žฌ a ์Šคํƒ์— ๋„ฃ๊ณ ์ž ํ•˜๋Š” ๊ทธ ์›์†Œ์˜ ์ž๋ฆฌ๋ฅผ a์Šคํƒ์˜ top์œผ๋กœ ๋‘๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ `ra`์˜ ํšŸ์ˆ˜๋ฅผ ๊ตฌํ•˜๊ณ , (`get_cnt_ra`) `rb`์˜ ํšŸ์ˆ˜๋ฅผ ๊ตฌํ•˜๊ณ , ๊ทธ ๋‘˜์„ ์กฐํ•ฉํ•ด์„œ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์ตœ์„ ์˜ ๋ช…๋ น์–ด์˜ ๊ฐœ์ˆ˜๊ฐ€ ๊ธฐ์กด์˜ ๋ช…๋ น์–ด์˜ ๊ฐœ์ˆ˜๋ณด๋‹ค ์ ์„ ๊ฒฝ์šฐ(`is_new_best_way`)์—๋Š” ์—…๋ฐ์ดํŠธ๋ฅผ ํ•ด์ฃผ๋Š” ๊ณผ์ •์„ ๊ณ„์†ํ•ด์„œ ๋ฐ˜๋ณตํ•˜๋ฉด์„œ ์ตœ์„ ์˜ ์„ ํƒ์„ ์ฐพ๋Š”๋‹ค. rotate ๋ช…๋ น์–ด ํšŸ์ˆ˜๋ฅผ ์ฐพ์„ ๋•Œ์—๋Š” ์„œ๋ธŒ์ ํŠธ์—์„œ rotate ๋ช…๋ น์–ด์™€ reverse rotate ๋ช…๋ น์–ด ๋‘๊ฐœ๋ฅผ ๊ตฌ๋ถ„ํ•˜์—ฌ ์ •์˜ํ•ด์คฌ๊ธฐ ๋•Œ๋ฌธ์— ๋งŒ์•ฝ ํ˜„์žฌ ์Šคํƒ์˜ ํฌ๊ธฐ์˜ ์ ˆ๋ฐ˜ ์ด์ƒ์˜ ํšŸ์ˆ˜๋งŒํผ rotate๋ฅผ ํ•ด์ค˜์•ผ ํ•  ๊ฒฝ์šฐ์—๋Š” reverse rotate๋ฅผ ํ•˜๊ฒŒ ํ•ด์„œ ์ข€ ๋” ๋ช…๋ น์–ด์˜ ํ˜ธ์ถœ ํšŸ์ˆ˜๋ฅผ ์ค„์—ฌ์ฃผ์—ˆ๋‹ค. ์ด ๊ณผ์ •์„ b์— ์›์†Œ๊ฐ€ ์—†์„ ๋•Œ๊นŒ์ง€ ๊ณ„์† ๋ฐ˜๋ณตํ•˜๋ฉด ์ •๋ ฌ์ด ์™„๋ฃŒ๋œ๋‹ค. ### โœจ visualizer ์œ„์˜ ์ •๋ ฌ๋ฐฉ๋ฒ•์„ push_swap visualizer๋กœ ๋Œ๋ ค๋ณด์•˜๋‹ค. ([GitHub - o-reo/push_swap_visualizer: A clean visualizer for your Push Swap Algorithm, you can't fix what you can't see !](https://github.com/o-reo/push_swap_visualizer)) ![[ab3c06e2-16db-4015-887c-85cf5a76e723.png]] ![[f953dbd7-27cd-45fd-8da2-5e1745a2a9a0.png]] ![[2a521a65-645d-4973-b50f-d223d0b8a053.png]] ![[40c93dff-fb7d-4749-8231-e19476c86155.png]] 1. pivot์„ ๊ธฐ์ค€์œผ๋กœ a์™€ b ์Šคํƒ์— ์ ˆ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆ„์–ด์ฃผ์—ˆ๋‹ค. 2. ํ•˜๋“œ์ฝ”๋”ฉ์œผ๋กœ ์ •๋ ฌ์ด ๊ฐ€๋Šฅํ•œ ์ˆ˜๋งŒ ๋‚จ๊ธฐ๊ณ  ๋ชจ๋‘ b ์Šคํƒ์œผ๋กœ ๋„˜๊ฒจ์ฃผ์—ˆ๋‹ค. 3. a ์Šคํƒ์„ ๋Œ๋ ค๊ฐ€๋ฉด์„œ ์ ์ ˆํ•œ ์œ„์น˜์— b์˜ ์›์†Œ๋ฅผ ๋„ฃ์–ด์ฃผ์—ˆ๋‹ค. 4. ๋ชจ๋“  ์›์†Œ๊ฐ€ a ์Šคํƒ์— ๋“ค์–ด์˜ค๋ฉด ๊ณผ์ œ์—์„œ ์š”๊ตฌํ–ˆ๋˜ ๋Œ€๋กœ ๊ฐ€์žฅ ์ž‘์€ ์›์†Œ๊ฐ€ top์— ์˜ค๋„๋ก ์Šคํƒ์„ ํšŒ์ „์‹œ์ผœ์ค€๋‹ค. ![[push_swap_visualization.gif]] ## ๐Ÿš€ ๊ฒฐ๋ก ๊ณผ ๋ฐ˜์„ฑ quick sort ๋กœ ๊ตฌํ˜„ํ–ˆ์„ ๋•Œ์—๋Š” ๋ช…๋ น์–ด๋ฅผ ์ €์žฅํ•ด๋‘์—ˆ๋‹ค๊ฐ€ ์ถœ๋ ฅ ์‹œ์— ์ตœ์ ํ™”ํ•˜๋Š” ๊ณผ์ •์ด ํ•„์š”ํ–ˆ๊ณ , ๊ทธ๋งˆ์ €๋„ ๋‚˜๋Š” pivot์„ ํ•˜๋‚˜๋งŒ ์ผ๊ธฐ ๋•Œ๋ฌธ์— ๋งŒ์  ๊ธฐ์ค€์„ ๋งž์ถ”๋Š”๊ฒƒ์ด ๊ฝค ๊นŒ๋‹ค๋กœ์› ๋Š”๋ฐ greedy ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•˜๋‹ˆ ๋งŒ์  ๊ธฐ์ค€์€ ๋„‰๋„‰ํ•˜๊ฒŒ ๋งž์ถœ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์‚ฌ์‹ค ๋‚˜๋Š” ์ด ๊ณผ์ œ๊ฐ€ ์š”๊ตฌํ•˜๋Š” ๋ฐ”๊ฐ€ "์ถœ๋ ฅ๋˜๋Š” ๋ช…๋ น์–ด์˜ ๊ฐœ์ˆ˜๋ฅผ ์ตœ์†Œํ™”ํ•˜๋Š” ๊ฒƒ"์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„๋ณต์žก๋„์— ๋Œ€ํ•ด์„œ๋Š” ๋ณ„๋กœ ๊ณ ๋ฏผํ•˜์ง€ ์•Š์•˜์—ˆ๋Š”๋ฐ ๋™๋ฃŒํ‰๊ฐ€๋•Œ ํ•œ ํ‰๊ฐ€์ž๋‹˜์ด ์ด ์„œ๋ธŒ์ ํŠธ์— ๋ณต์žก๋„์— ๋Œ€ํ•œ ๊ณ ๋ฏผ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ณผ์ œ๋ผ๋Š” ์–ธ๊ธ‰์ด ๋˜์–ด ์žˆ๋‹ค๋Š” ์ ์„ ์งš์–ด ์ฃผ์…จ๋‹ค. ํ•˜ํ•˜ ์ผ๋‹จ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ณผ์ œ์ด๊ณ , ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ณต๋ถ€ํ•˜๋ฉด์„œ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” ๋บ„ ์ˆ˜ ์—†๋Š” ์ฃผ์ œ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด๊ฐ€ ๊ตฌํ˜„ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” ์–ด๋А์ •๋„ ๋‚˜์˜ฌ์ง€ ๊ณ ๋ฏผ์„ ํ•ด ๋ดค์œผ๋ฉด ๋” ์ข‹์ง€ ์•Š์•˜์„๊นŒ ํ•˜๋Š” ์ƒ๊ฐ์„ ํ–ˆ๊ณ , ๋‚˜์ค‘์— ํ‰๊ฐ€๋ฅผ ๋‹ค๋‹ˆ๋‹ค ๋‚˜๋ž‘ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ํ‘ธ์‹  ๋ถ„์ด ๊ณ„์‹œ๋‹ค๋ฉด ์‹œ๊ฐ„๋ณต์žก๋„์— ๋Œ€ํ•ด์„œ ํ•œ๋ฒˆ ์—ฌ์ญค๋ด์•ผ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์„ ํ–ˆ๋‹คใ…‹ใ…‹