๐ push_swap : ์ ์ฝ(Constraints) ์์์ ์ต์ ์ ๊ฒฝ๋ก๋ฅผ ํ์ํ๋ค
์ด ๊ณผ์ ์ ํต์ฌ์ ์๊ณ ๋ฆฌ์ฆ ๋ง๋ณด๊ธฐ๋ผ๋ ์ผ์ด์๋ค.
์ด์ ์ ๊ณผ์ ๋ค์ด C์ธ์ด์ ๋ฌธ๋ฒ, ์์คํ
๊ณผ์ ์ํต ๋ฐฉ์์ ์ตํ๋ ๊ณผ์ ์ด์๋ค๋ฉด, push_swap์ ์์ ํ ์๋ก์ด ์ฐจ์์ ์ง๋ฌธ์ ๋์ง๋ค: โ์๊ฒฉํ ์ ์ฝ ์กฐ๊ฑด ํ์์, ์ด๋ป๊ฒ โ์ต์ (Optimal)โ์ ํด๋ฅผ ์ฐพ์๋ผ ๊ฒ์ธ๊ฐ?โ
์ด ๊ณผ์ ๋ ๋จ์ํ ์ฃผ์ด์ง ์ซ์๋ฅผ ์ ๋ ฌํ๋ ๋ฌธ์ ๊ฐ ์๋๋ค. ๋ ๊ฐ์ ์คํ์ด๋ผ๋ ์ ํ๋ ๊ณต๊ฐ๊ณผ 11๊ฐ์ ๋ช ๋ น์ด(์ธ๋ถ์ ๋ ธ์ถ ๋ ์ ์๋ ๋ช ๋ น ๊ฐฏ์)๋ผ๋ ํ์ ๋ ๋๊ตฌ๋ง์ ์ฌ์ฉํ์ฌ, ๊ฐ์ฅ ํจ์จ์ ์ธ ๋ฐ์ดํฐ์ โ์ด๋ ๊ฒฝ๋กโ๋ฅผ ์ค๊ณํด์ผ ํ๋ ๋ณต์กํ ์ต์ ํ ๋ฌธ์ (Optimization Problem)์ด๋ค.
Minitalk๊ฐ ์์์ ์ธ ์ ํธ ์์ ํต์ ํ๋กํ ์ฝ์ ์์ ์ฌ๋ฆฌ๋ ๊ฒฝํ์ด์๋ค๋ฉด, push_swap์ ํผ๋(Unordered state) ์์์ ์ง์(Sorted state)๋ก ๋์๊ฐ๋ ๊ฐ์ฅ ์ฐ์ํ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ ์ ์ฐพ์๋ด๋ ๊ณผ์ ์ด์๋ค.
์ด๋ ์ ํด์ง ๋ต์ ๊ตฌํํ๋ ๊ฒ์ ๋์ด, ๋ฌธ์ ์ ๋ณธ์ง์ ๊ฟฐ๋ซ๊ณ ์์ ๋ง์ ํด๊ฒฐ ์ ๋ต, ์ฆ ํด๋ฆฌ์คํฑ(Heuristic)์ ์ฐฝ์กฐํ๊ณ ์ฆ๋ช ํด์ผ ํ๋, ์ง์ ํ ์๋ฏธ์ ๋ฌธ์ ํด๊ฒฐ ๋ฅ๋ ฅ์ ๋ํ ์ํ๋์๋ค.
๐ฒ ๋ฌธ์ ๊ณต๊ฐ์ ์ ์: ๋ ๊ฐ์ ์คํ๊ณผ 11๊ฐ์ ์ฐ์ฐ์
push_swap์ ์ธ๊ณ๋ ๋ค์์ ๊ณต๋ฆฌ(Axioms) ์์ ์ธ์์ ธ ์๋ค.
- ๋ ๊ฐ์ ์คํ (
a,b): ๋ชจ๋ ์ฐ์ฐ์ ์ฃผ์ฒด์ด์ ๋์์ด ๋๋ ์ ์ผํ ๋ฐ์ดํฐ ๊ตฌ์กฐ. ์ด๋ ์์ ์ ๊ทผ(Random Access)์ด ๋ถ๊ฐ๋ฅํ๊ณ ์ค์ง LIFO(Last-In, First-Out) ์ ๊ทผ๋ง ํ์ฉ๋๋ ๊ทผ๋ณธ์ ์ธ ์ ์ฝ์ ์๋ฏธํ๋ค. - 11๊ฐ์ ์ฐ์ฐ์ (
sa,pb,ra,rra๋ฑ): ์คํ์ ์ํ๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ ์ ์ผํ ํฉ๋ฒ์ ์ธ ํ์. ๊ฐ ์ฐ์ฐ์๋ โ1โ์ด๋ผ๋ ๋น์ฉ(cost)์ ๊ฐ์ง๋ฉฐ, ๊ณผ์ ์ ๋ชฉํ๋ ์ด ๋น์ฉ์ ์ดํฉ์ ์ต์ํํ๋ ๊ฒ์ด๋ค.
์ด๋ฌํ ์ ์ฝ์ ํต ์ ๋ ฌ์ด๋ ๋ณํฉ ์ ๋ ฌ๊ณผ ๊ฐ์ ๊ณ ์ ์ ์ธ ํจ์จ์ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉ์ ์์ฒ์ ์ผ๋ก ์ฐจ๋จํ๋ค. ๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ ์ด ๋ฌธ์ ๊ณต๊ฐ์ ํน์ฑ์ ๋ง๋ ์๋ก์ด ์ ๋ต์ ์๋ฆฝํด์ผ๋ง ํ๋ค.
๐ก ํต์ฌ ์ ๋ต: LIS (์ต์ฅ ์ฆ๊ฐ ๋ถ๋ถ ์์ด)๋ฅผ ์ด์ฉํ ๋ฌธ์ ์ฌ์ ์
์ ์ผ ์ฒ์ ์ด ๋ฌธ์ ๋ฅผ ๋ฐ์์ ๋, ๋จธ๋ฆฌ๊ฐ ํ์๊ฒ ๋ณํ๋ ๊ฒ์ ๋๊ผ๋ค. ๋ด๊ฐ ํ ์ผ์ด ๋ญ์ง๋ฅผ ์๊ฒ ๊ณ ๊ตฌํ์ ํ์ง๋ง, ๊ฐ ํ๋์ ์ด๋ป๊ฒ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์ฎ์ด์ผ ํ์ง?
์ง๊ธ์ ๊ทธ๋๋ AI ๋ก ์ ๊ทผ์ ๋๋ ๊ฒ์ด์์ง๋ง, ํต์ฌ์ ์ธ ์ฐ์ฐ์๋ฅผ ๊ตฌํํ๊ฑธ ์ด๋ป๊ฒ ์ฎ์ด์ผ ์๊ณ ๋ฆฌ์ฆ์ ๋ฐฉ์์ ์ ์ฉ์ ํด์ ์ต์ ํ ์ํค์ง? ์ด ๋ฌธ์ ๋ ๊ณ์ ๋จธ๋ฆฌ๋ฅผ ์ฅ์ด ๋ฏ๊ฒ ๋ง๋ค๊ณ , ๋ญ ์ผ๋ง๋ ํด์ผํ ์ง์ ๋ํ ๋ง์ค์์ ๋ง๋ค์๋ ๊ธฐ์ต์ด ๋๋ค.
๊ทธ๋ ๊ฒ ์ด๋์ ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋ํด ์ดํด๊ฐ ์์ด๊ธฐ ์์ํ๊ณ , ์์ ๋ธ ์ ์๊ฒ ๋ ๊ฒ์ โ์ด๋ป๊ฒ ์์ง์์ ์๋ฅผ ์ต์ํํ ๊ฒ์ธ๊ฐ?โ๋ผ๋ ์ง๋ฌธ์ ๋ฌธ์ ์์ฒด๋ฅผ ์ฌ์ ์ํ๋ ๊ฒ์ ํ๋ฉด์ ๋ถํฐ ์กฐ๊ธ์ฉ ๊ฐ๋ฅํด์ง๊ธฐ ์์ํ๋ค.
โ๋ชจ๋ ์์๋ฅผ ์ ๋ ฌํ๋ ค ํ์ง ๋ง๊ณ , ์ด๋ฏธ ์ ๋ ฌ๋ ๊ฒ์ ๊ฐ๊น์ด ์์๋ค์ ๊ทธ๋๋ก ๋ ์ฑ, ํ๋ฆ์ ๋ฐฉํดํ๋ ์ต์ํ์ ์์๋ค๋ง ์ฎ๊ธฐ๋ฉด ์ด๋จ๊น?โ
์ด ์ ๊ทผ๋ฒ์ ์ฒ์ ์๊ฒ ๋๊ณ , ๊ธฐ์กด์ ๋ฐฉ๋ฒ์์ ํด๋ฉ๋ ๋์ค์ด์๊ณ , ๊ทธ ๊ฒฐ๊ณผ ๋๋ ์ ๋ ์นด๋ฅผ ๋ถ๋ ๋ค. ์ด ๋ฐฉ๋ฒ์ด๋ผ๋ฉด ๋ญ๊ฐ ๊ตฌํ์ด ๊ฐ๋ฅํ ๊ฒ์ผ๋ก ๋ณด์ด๊ณ , ๋ด ์ดํด๋๋ฅผ ๋์ด๋ฉด์ ์ต์ ํ๋ฅผ ์ด๋ฃฐ ์ ์์ ๊ฒ ๊ฐ๋ค๋ ๊ฐ๊ฐ์ ์ธ ํ์ . ์ด๋ฌํ ํ์ ์ ๊ตฌํํ ๊ฒ์ด ๋ฐ๋ก LIS (Longest Increasing Subsequence) ์๊ณ ๋ฆฌ์ฆ, ํ๊ตญ์ด ๋ช ์ต์ฅ์ฆ๊ฐ์์ด ์๊ณ ๋ฆฌ์ฆ์ด์๋ค.
- ๊ธฐ์ค์ ์ค์ (LIS ํ์): ๋จผ์ ์คํ
a์ ์กด์ฌํ๋ ์ซ์๋ค ์ค์์ LIS, ์ต์ฅ ์ฆ๊ฐ ์์ด์ ์ฐพ๋๋ค. LIS์ ์ํ ์์๋ค์ ์ต์ข ์ ์ผ๋ก ์ ๋ ฌ๋ ์ํ์์๋ ๊ทธ ์๋์ ์์๋ฅผ ์ ์งํ ๊ฐ๋ฅ์ฑ์ด ๋์ โ์ต์ปค(Anchor)โ ๊ทธ๋ฃน์ด๋ค. ์ด๋ค์ ์ฐ๋ฆฌ๊ฐ ์ต์ํ์ผ๋ก ์์ง์ฌ์ผ ํ ๋์, ์ฆ ๋ณด์กดํด์ผ ํ ๊ฐ์น๊ฐ ๊ฐ์ฅ ํฐ ์์๋ค์ ๋ฌถ์์ด์๋ค. - ๋ฌธ์ ์ ๋ถ๋ฆฌ: LIS ํ์ ํ, ๋ฌธ์ ๋ ๋ ๊ฐ์ง ํ์ ๋ฌธ์ ๋ก ๋ถ๋ฆฌ๋๋ค.
- LIS์ ์ํ์ง ์๋ ์์๋ค์ ์คํ
b๋ก ๊ฐ์ฅ ํจ์จ์ ์ผ๋ก ์ด๋์ํค๋ ๋ฌธ์ . - ์คํ
b์ ์์๋ค์ ๋ค์ ์คํa์ ์ฌ๋ฐ๋ฅธ ์์น๋ก ์ต์ ๋น์ฉ์ผ๋ก ์ฝ์ ํ๋ ๋ฌธ์ .
- LIS์ ์ํ์ง ์๋ ์์๋ค์ ์คํ
์ด์ฒ๋ผ LIS๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฌธ์ ๋ฅผ ์ฌ์ ์ํจ์ผ๋ก์จ, โN๊ฐ์ ์์๋ฅผ ์ ๋ ฌํ๋ ๋ฌธ์ โ๋ โN-K๊ฐ์ ์์(K๋ LIS์ ๊ธธ์ด)๋ฅผ ๊ฐ์ฅ ํจ์จ์ ์ผ๋ก ์ด๋์ํค๋ ๋ฌธ์ โ๋ก ๋จ์ํ๋๋ค. ์ด๋ ๋ณต์กํ ๋ฌธ์ ์ ์ง๋ฉดํ์ ๋, ๋ถ๋ณ์ ๊ธฐ์ค์ ์ฐพ์๋ด๊ณ ์ด๋ฅผ ์ค์ฌ์ผ๋ก ๋ฌธ์ ๋ฅผ ๋ถํดํ๋ ๊ฐ๋ ฅํ ๋ฌธ์ ํด๊ฒฐ ์ ๋ต์ด๋ฉฐ, ๋ฌด์๋ณด๋ค ์ง๊ด์ ์ด๋ผ๋ ์ฅ์ ์ ๊ธฐ์กด์ ๋ง๋ค์ด๋ ๊ธฐ๋ฅ๋ค์ ํ์ฉํ ๊ตฌํ์์ ์์ฃผ ํจ๊ณผ์ ์ด์๋ค.
๐ ํ์ ์๊ณ ๋ฆฌ์ฆ(Greedy Algorithm)์ ์ ์ฉ: ์ต์ ์ฝ์ ๊ฒฝ๋ก ํ์
์ด๋ ๊ฒ LIS ๊ทธ๋ฃน์ ๋ฐ๊ฒฌํ๊ณ ๋๋ฉด, ์ด๋ฅผ ์ ์ธํ ๋ชจ๋ ์์๊ฐ ์คํ b๋ก ์ฎ๊ฒจ์ง ํ, ๋ง์ง๋ง ๋จ๊ณ๋ ์คํ b์ ์์๋ค์ ๋ค์ a๋ก ๋๋ ค๋ณด๋ด๋ ๊ฒ์ด๋ค.
์ด ๊ณผ์ ์ ๋งค ์๊ฐ โ์ง์ญ์ ์ผ๋ก ์ต์ ์ธ(Locally Optimal)โ ์ ํ์ ๋ฐ๋ณตํ๋ ํ์ ์๊ณ ๋ฆฌ์ฆ์ ์์ด๋์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋์ํ๋ค. ์ด๋ ํต์ฌ์ ๋จ์ํ ๊ฐ๊ฐ ์คํ์ผ๋ก ์ฎ๊ธฐ๋ ๋ฐฉ๋ฒ๋ ์์ง๋ง, ๋์์ ์์ชฝ์ ๊ฐ์ด ์์ง์ด๊ฑฐ๋, ์ ์ ํ๊ฒ ์คํ๋ ค ๊ฑฐ๊พธ๋ก ์์๋ฅผ ์ ๋ฆฌํ๋ ๋๊ตฌ๋ค์ ์ผ๋ง๋ ๊ฐ ์คํ ์์ ๊ณตํต์ ์ผ๋ก ๋ฌถ์ด์ ๋์์ ์คํํ๋์ ๋ฌ๋ ค ์์๋ค.
- ๋น์ฉ ํจ์ ์ ์: ์คํ
b์ ํน์ ์์๋ฅผ ์คํa์ ์ฌ๋ฐ๋ฅธ ์์น์ ์ฝ์ ํ๊ธฐ ์ํด ํ์ํra,rra,rb,rrb์ฐ์ฐ์ ์ด ํ์๋ฅผ โ๋น์ฉโ์ผ๋ก ์ ์ํ๋ค. - ์ต์ ํด ํ์: ์คํ
b์ ๋ชจ๋ ์์์ ๋ํด ์ด ๋น์ฉ์ ๊ณ์ฐํ๊ณ , ๊ทธ์ค ๊ฐ์ฅ ๋น์ฉ์ด ๋ฎ์, ์ฆ ๊ฐ์ฅ ์ ์ ์ฐ์ฐ์ผ๋ก ์ ์๋ฆฌ๋ฅผ ์ฐพ์๊ฐ ์ ์๋ ์์๋ฅผ ์ด๋ฒ ํด์ ์ด๋์ํฌ ๋์์ผ๋ก ์ ํํ๋ค. - ์ต์ ํ: ๋ง์ฝ
a์b์คํ์ด ๊ฐ์ ๋ฐฉํฅ์ผ๋ก ํ์ ํด์ผ ํ๋ค๋ฉด(ra์rb), ์ด๋ฅผrr์ด๋ผ๋ ๋จ์ผ ์ฐ์ฐ์ผ๋ก ํตํฉํ์ฌ ๋น์ฉ์ ์ ๊ฐํ๋ ์ต์ ํ๋ฅผ ์ ์ฉํ๋ค. ์ด์ ๋ฐ๋์ ๊ฒฝ์ฐ์rrr์ ์ฌ์ฉํ๋ค.
์ด ๊ณผ์ ์ ์คํ b๊ฐ ๋น ๋๊น์ง ๋ฐ๋ณตํจ์ผ๋ก์จ, ์ ์ฒด ์ด๋ ๋น์ฉ์ ์ต์ํํ๋ ๊ฒฝ๋ก์ ๊ทผ์ฌํ ์ ์๋ค.
โจ ์ฑ์ฐฐ ๋ฐ ๋ฐฐ์ด ์
์ด ๊ณผ์ ๋ ์ฒด๊ฐ์ printf ๋ณด๋ค๋ ์ด๋ ต๊ณ , ์ด์ฉ๋ฉด 42์์ธ ๊ณผ์ ์ค์์ ์๋นํ ๊ธธ๊ฒ ๊ฑธ๋ฆฐ, push_swap์ ๋
ผ๋ฆฌ์ ์ฌ๊ณ ์ ์ ๋ต์ ์ค๊ณ, ์ํ์ ๊ฐ๊ฐ ๋ฑ์ ๋ฅ๋ ฅ์ ์๊ตฌํ๋ ๊ณผ์ ์๋ค. ๋๊ฐ์ ๋ฌธ๊ณผ์๋ค์๊ฒ๋ ์ ๋ง ์ง์ฅ๊ณผ๋ ๊ฐ์๋ ์๊ฐ์ด๋ผ๊ณ (โฆ.), ๊ทธ๋ฆฌ๊ณ ๋์์ ๊ทธ๋ ๊ธฐ์ ์ง์ง ์ํ์ ์ ๊ทธ๋ฆฌ ์ด์ฌํ ๋ฐฐ์ฐ๋ ์ง๋ฅผ ์ ์ ์์๋ค.
๊ทธ๋ผ์๋ ์ด ๊ณผ์ ๋ฅผ ๋ง๋ฌด๋ฆฌ ํจ์ผ๋ก์จ
- ์๊ณ ๋ฆฌ์ฆ์ ์ฌ๊ณ ๋ก์ ์ ํ: โ์ด๋ป๊ฒ ๊ตฌํํ ๊นโ๋ฅผ ๋์ด โ์ด๋ค ์ ๋ต์ด ๊ฐ์ฅ ํจ์จ์ ์ผ๊นโ๋ฅผ ๊ณ ๋ฏผํ๊ฒ ๋ง๋ค์๋ค. ์ด๋ ๋จ์ํ ์ฝ๋๋ฅผ ์ง๋ ํ์์์ ๋ฌธ์ ๋ฅผ ๋ถ์ํ๊ณ ํด๊ฒฐ์ฑ ์ ์ค๊ณํ๋ ๋จ๊ณ๋ก์ ์ฑ์ฅ์ ์๋ฏธํ๊ณ , ํนํ๋ ์ ๊ทธ๋ ๊ฒ โ์๊ณ ๋ฆฌ์ฆโ์ด๋ผ๋ ํค์๋์ ๊ฐ๋ฐ์๋ค์ด ๊ฐ์กฐํ๊ณ , ์ด๋ฅผ ํตํด ์ผ๋ง๋ ์์ ์ ์ฐจ์ด๊ฐ ํฌ๊ฒ ๋๋์ง๋ฅผ ์ง์ ๋์ผ๋ก ๋ณผ ์ ์๋ ๊ฒฝํ์ด๋ผ๊ณ ์๊ฐํ๋ค.
- ํด๋ฆฌ์คํฑ์ ๊ฐ์น: ์ํ์ ์ผ๋ก ์๋ฒฝํ ์ต์ ํด๋ฅผ ์ฐพ๋ ๊ฒ์ ๋งค์ฐ ์ด๋ ต๊ฑฐ๋(NP-hard) ๋นํจ์จ์ ์ผ ์ ์๋ค. LIS๋ผ๋ ๊ฐ๋ ฅํ ํด๋ฆฌ์คํฑ์ ํตํด โ์ถฉ๋ถํ ์ข์(good enough)โ ํด๋ฅผ ํจ์จ์ ์ผ๋ก ์ฐพ์๋ด๋ ๊ณผ์ ์, ํ์ค ์ธ๊ณ์ ๋ณต์กํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ์ค์ฉ์ ์ธ ์ ๊ทผ๋ฒ์ ๊ฐ๋ฅด์ณ์ฃผ์๋ค.
- ์ฐ์ฐ์ ๋น์ฉ์ ๋ํ ๊ฐ๊ฐ: ๋ชจ๋ ๋ช ๋ น์ด์ โ๋น์ฉโ์ด๋ผ๋ ๊ฐ๋ ์ด ์กด์ฌํจ์ ์ธ์งํ๊ฒ ๋์๋ค. ์ด๋ โ์๋ํ๋ ์ฝ๋โ์ โํจ์จ์ ์ธ ์ฝ๋โ์ ์ฐจ์ด๋ฅผ ๋ช ํํ ๊ตฌ๋ถํ๊ฒ ๋ง๋ค์์ผ๋ฉฐ, ์ฑ๋ฅ ์ต์ ํ์ ๋ํ ๋ง์ธ๋์ ์ ์ฌ์ด์ฃผ์๋ค.
push_swap์ ์คํ์ด๋ผ๋ ๋จ์ํ ์๋ฃ๊ตฌ์กฐ ์์์ ํผ์ณ์ง๋ ํ ํธ์ ๋
ผ๋ฆฌ์ ์ธ ์์ธ ์๋ค. ์ด ํ๋ก์ ํธ๋ฅผ ํตํด ๋๋ ๋น๋ก์ ์ฃผ์ด์ง ๋ฌธ์ ์ ์ ์ฝ ์กฐ๊ฑด์ ์ดํดํ๊ณ , ๊ทธ ์์์ ์ต์ ์ ํด๊ฒฐ์ฑ
์ ์ค๊ณํ๋ โ์๊ณ ๋ฆฌ์ฆ ์ค๊ณ์โ๋ก์์ ์ฒซ๊ฑธ์์ ๋ ์ ์์๋ค.
